Bình thường, tôi sẽ đồng ý với Yaakov Ellis nhưng trong trường hợp đặc biệt này còn có một giải pháp khả thi:
Sử dụng hai bảng:
Table: Item
Columns: ItemID, Title, Content
Indexes: ItemID
Table: Tag
Columns: ItemID, Title
Indexes: ItemId, Title
này có một số ưu điểm chính:
Đầu tiên nó làm cho 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 bảng Tag
để xem có mục nhập nào không. Sau đó, bạn phải tham gia với những người mới. Đây không phải là nhiệm vụ tầm thường.
Sau đó, truy vấn sẽ đơn giản hơn (và có thể 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 Tag cho một Item:
3-Bảng:
SELECT Tag.Title
FROM Tag
JOIN ItemTag ON Tag.TagID = ItemTag.TagID
WHERE ItemTag.ItemID = :id
2-Bảng:
SELECT Tag.Title
FROM Tag
WHERE Tag.ItemID = :id
Tag-Cloud:
3- Bảng:
SELECT Tag.Title, count(*)
FROM Tag
JOIN ItemTag ON Tag.TagID = ItemTag.TagID
GROUP BY Tag.Title
2-Bảng:
SELECT Tag.Title, count(*)
FROM Tag
GROUP BY Tag.Title
mục cho một Tag:
3-Bảng:
SELECT Item.*
FROM Item
JOIN ItemTag ON Item.ItemID = ItemTag.ItemID
JOIN Tag ON ItemTag.TagID = Tag.TagID
WHERE Tag.Title = :title
2-Bảng:
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: Có thể mất nhiều không gian hơn trong cơ sở dữ liệu (có thể dẫn đến nhiều hoạt động đĩa chậm hơn) và không được chuẩn hóa mà có thể dẫn đến mâu thuẫn.
Đối số kích thước không phải là mạnh bởi vì bản chất của các thẻ là chúng thường nhỏ nên kích thước tăng không lớn. Người ta có thể cho rằng truy vấn cho tiêu đề thẻ nhanh hơn nhiều trong một bảng nhỏ chứa mỗi thẻ một lần và điều này chắc chắn là đúng. Nhưng lấy tiề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 đồng nhất cũng là một chút tranh luận. Thẻ là 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ả thẻ' foo 'thành' bar ''.
Vì vậy, tldr: Tôi sẽ đi cho giải pháp hai bảng. (. Trong thực tế tôi sẽ tôi tìm thấy bài viết này để xem nếu có đối số hợp lệ chống lại nó.)
OK đây là câu hỏi # 20856, câu hỏi tương tự (gần như) là # 48475 được hỏi ít nhất hai tuần sau khi câu hỏi này được hỏi. – dlamblin
Một câu hỏi thú vị khác là "Cách SO triển khai thẻ?" – Mostafa
Một câu hỏi thú vị khác là "Bạn có quốc tế hoá chúng không, và nếu có thì làm thế nào?" – DanMan