EDIT: Để mọi người xây dựng hệ thống gắn thẻ. Đừng đọc điều này. Nó không phải là những gì bạn đang tìm kiếm. Tôi hỏi điều này khi tôi không nhận thức được rằng RDBMS đều có phương pháp tối ưu hóa riêng của họ, chỉ cần sử dụng một sơ đồ đơn giản đến nhiều.Sơ đồ gắn thẻ cơ sở dữ liệu có thể mở rộng
Tôi có hệ thống đăng bài có hàng triệu bài đăng. Mỗi bài đăng có thể có số lượng thẻ vô hạn được liên kết với nó.
Người dùng có thể tạo thẻ có ghi chú, ngày tạo, chủ sở hữu, v.v. Một thẻ gần giống như bài đăng, bởi vì mọi người có thể đăng ghi chú về thẻ.
Mỗi liên kết thẻ có chủ sở hữu và ngày, vì vậy chúng tôi có thể xem ai đã thêm thẻ và thời điểm.
Câu hỏi của tôi là làm cách nào để tôi có thể triển khai tính năng này? Nó phải nhanh chóng tìm kiếm các bài viết theo tag, hoặc các thẻ của bài viết. Ngoài ra, người dùng có thể thêm thẻ vào bài đăng bằng cách nhập tên vào trường, giống như thanh tìm kiếm của Google, nó phải điền vào phần còn lại của tên thẻ cho bạn.
Tôi có 3 giải pháp vào lúc này nhưng không chắc chắn giải pháp nào là tốt nhất hoặc nếu có cách nào tốt hơn.
Lưu ý rằng tôi không hiển thị bố cục ghi chú vì nó sẽ không đáng kể khi tôi nhận được giải pháp thích hợp cho thẻ.
Phương pháp 1. danh sách liên kết
tagId trong bài điểm vào một danh sách liên kết trong tag_assoc, ứng dụng phải đi qua danh sách cho đến khi flink = 0
post: id, content, ownerId, date, tagId, notesId
tag_assoc: id, tagId, ownerId, flink
tag: id, name, notesId
Phương pháp 2. denormalization
thẻ chỉ đơn giản là một trường VARCHAR hoặc TEXT có chứa một mảng được phân cách bằng thẻ tagId: ownerId. Nó không thể là một kích thước cố định.
post: id, content, ownerId, date, tags, notesId
tag: id, name, notesId
Phương pháp 3. Toxi
(từ: http://www.pui.ch/phred/archives/2005/04/tags-database-schemas.html, cũng điều tương tự ở đây: Recommended SQL database design for tags or tagging)
post: id, content, ownerId, date, notesId
tag_assoc: ownerId, tagId, postId
tag: id, name, notesId
Phương pháp 3 đặt ra câu hỏi, làm thế nào nhanh chóng sẽ nó được lặp đi lặp lại qua từng một hàng trong tag_assoc?
Phương pháp 1 và 2 phải nhanh để trả lại thẻ theo bài đăng, nhưng đối với bài đăng theo thẻ, phải tìm một bảng tra cứu khác.
Điều cuối cùng tôi phải lo lắng là tối ưu hóa tìm kiếm thẻ theo tên, tôi chưa làm việc đó.
tôi đã thực hiện một sơ đồ ASCII ở đây: http://pastebin.com/f1c4e0e53
Thẻ được chia sẻ trên các bài đăng. Tôi đã quyết định khá nhiều về phương pháp 3 ngay bây giờ. Mỗi bảng có thể có thẻ sẽ có một bảng khác gọi là _tags. EG: news_tags. Tôi vẫn còn sơ sài về phương pháp này, nhưng mọi người dường như đề xuất nó, vì vậy tôi giả sử MySQL sẽ tối ưu hóa nó. –
"giả định" - ý tưởng tồi. Biết là tốt hơn. – duffymo