Thông thường tôi sẽ đồng ý với Yaakov Ellis nhưng trong trường hợp đặc biệt này có một giải pháp khả thi khác:
Sử dụng hai bảng:
Table: Item
Columns: ItemID, Title, Content
Indexes: ItemID
Table: Tag
Columns: ItemID, Title
Indexes: ItemId, Title
Điều này có một số lợi thế lớn:
Đầu tiên, nó làm cho việc phát triển đơn giản hơn nhiều: trong giải pháp ba bảng để chèn và cập nhật, item
bạn phải tra cứu Tag
bảng để xem đã có mục nào chưa. Sau đó, bạn phải tham gia với họ với những cái mới. Đây không phải là nhiệm vụ tầm thường.
Sau đó, nó làm cho các truy vấn đơn giản hơn (và có lẽ nhanh hơn). Có ba truy vấn cơ sở dữ liệu chính mà bạn sẽ thực hiện: Xuất tất cả Tags
cho một Item
, vẽ Thẻ đám mây và chọn tất cả các mục cho một Tiêu đề thẻ.
Tất cả các thẻ cho một mục:
3 bàn:
SELECT Tag.Title
FROM Tag
JOIN ItemTag ON Tag.TagID = ItemTag.TagID
WHERE ItemTag.ItemID = :id
Bảng 2:
SELECT Tag.Title
FROM Tag
WHERE Tag.ItemID = :id
Thẻ đám mây:
3 bàn:
SELECT Tag.Title, count(*)
FROM Tag
JOIN ItemTag ON Tag.TagID = ItemTag.TagID
GROUP BY Tag.Title
Bảng 2:
SELECT Tag.Title, count(*)
FROM Tag
GROUP BY Tag.Title
Các mục cho một Thẻ:
3 bàn:
SELECT Item.*
FROM Item
JOIN ItemTag ON Item.ItemID = ItemTag.ItemID
JOIN Tag ON ItemTag.TagID = Tag.TagID
WHERE Tag.Title = :title
Bảng 2:
SELECT Item.*
FROM Item
JOIN Tag ON Item.ItemID = Tag.ItemID
WHERE Tag.Title = :title
Nhưng cũng có một số nhược điểm: Nó có thể chiếm nhiều không gian hơn trong cơ sở dữ liệu (điều này có thể dẫn đến nhiều hoạt động đĩa chậm hơn) và nó không được chuẩn hóa có thể dẫn đến sự không nhất quán.
Đối số kích thước không mạnh vì bản chất của thẻ là chúng thường khá nhỏ nên mức tăng kích thước không phải là lớn. Người ta có thể lập luận rằng truy vấn cho tiêu đề thẻ nhanh hơn nhiều trong một bảng nhỏ chỉ chứa mỗi thẻ một lần và điều này chắc chắn là đúng. Nhưng có liên quan đến khoản tiết kiệm cho việc không phải tham gia và thực tế là bạn có thể xây dựng một chỉ số tốt trên chúng có thể dễ dàng bù đắp cho điều này. Điều này tất nhiên phụ thuộc rất nhiều vào kích thước của cơ sở dữ liệu bạn đang sử dụng.
Đối số không nhất quán là một chút tranh luận quá. Thẻ là các trường văn bản miễn phí và không có hoạt động dự kiến như 'đổi tên tất cả các thẻ "foo" thành "bar"'.
Vì vậy, tldr: Tôi sẽ đi cho giải pháp hai bàn. (Trong thực tế tôi sẽ đến. Tôi tìm thấy bài viết này để xem liệu có đối số hợp lệ chống lại nó không.)