Tôi khuyên bạn nên sử dụng mối quan hệ nhiều-nhiều điển hình giữa thông điệp và thẻ.
Điều đó có nghĩa là bạn cần 3 bảng.
-
Messages
(các cộtId
,UserId
vàContent
) -
Tags
(các cộtId
vàTagName
) -
TagMessageRelations
(các cột:MessageId
vàTagId
- để tạo kết nối giữa tin nhắn và thẻ - thông qua các khóa ngoại trỏ đếnMessages.Id
/Tags.Id
)
Bằng cách đó, bạn không lưu trữ một thẻ nhiều lần mà chỉ tạo một mối quan hệ mới với một thư (tất nhiên là nếu thẻ đó đã tồn tại trong bảng thẻ).
Bằng cách này, bạn có thể
- dễ dàng đếm có bao nhiêu thẻ có (
SELECT COUNT(*) FROM Tags
) - chỉ lưu mỗi thẻ một lần và tìm kiếm các thẻ có thể được lập chỉ mục dễ dàng
- hoặc đếm số lần một thẻ nhất định đã được sử dụng mỗi người dùng - ví dụ:
SELECT
COUNT(*)
FROM Tags
INNER JOIN TagMessageRelations ON Tags.Id = TagMessageRelations.TagId
INNER JOIN Messages ON TagMessageRelations.MessageId = Messages.Id
GROUP BY Messages.UserId