Tôi là một nhà phát triển phần mềm. Tôi thích viết mã, nhưng tôi ghét cơ sở dữ liệu ... Hiện tại, tôi đang tạo một trang web mà người dùng sẽ được phép đánh dấu một thực thể là thích (như trong FB), gắn thẻ và nhận xét .
Tôi bị kẹt trên thiết kế bảng cơ sở dữ liệu để xử lý chức năng này. Giải pháp là tầm thường, nếu chúng ta chỉ có thể làm điều này cho một loại điều (ví dụ: ảnh). Nhưng tôi cần kích hoạt điều này cho 5 thứ khác nhau (hiện tại, nhưng tôi cũng cho rằng con số này có thể tăng lên, khi toàn bộ dịch vụ tăng lên).
Tôi đã tìm thấy một số câu hỏi tương tự ở đây, nhưng không ai trong số họ có câu trả lời thỏa mãn, vì vậy tôi lại hỏi câu hỏi này.
Câu hỏi là, làm thế nào để thiết kế cơ sở dữ liệu đúng cách, hiệu quả và linh hoạt, để nó có thể lưu trữ các bình luận cho các bảng khác nhau , thích cho các bảng và thẻ khác nhau cho chúng. Một số mẫu thiết kế như câu trả lời sẽ là tốt nhất;)
Mô tả chi tiết : Tôi có một bảng User
với một số dữ liệu người dùng và 3 bảng nữa : Photo
với các bức ảnh , Articles
với các bài báo , Places
với các địa điểm . Tôi muốn cho phép bất kỳ người dùng nào đăng nhập để:
nhận xét về bất kỳ 3 bảng nào
đánh dấu bất kỳ ai trong số họ là thích
gắn thẻ bất kỳ trong số họ với một số thẻ
Tôi cũng muốn đếm số lượt thích cho mỗi yếu tố và số lần thẻ cụ thể được sử dụng.
Cách tiếp cận thứ 1 :
a) Đối với thẻ , tôi sẽ tạo ra một bảng Tag [TagId, tagName, tagCounter]
, sau đó tôi sẽ tạo ra nhiều-nhiều mối quan hệ bảng cho: Photo_has_tags
, Place_has_tag
, Article_has_tag
.
b) Cùng tính cho ý kiến.
c) Tôi sẽ tạo ra một bảng LikedPhotos [idUser, idPhoto]
, LikedArticles[idUser, idArticle]
, LikedPlace [idUser, idPlace]
. Số lượt thích sẽ được tính bằng các truy vấn (trong đó, tôi cho là xấu). Và ...
Tôi thực sự không thích thiết kế này cho phần cuối cùng, nó có mùi rất tệ đối với tôi;)
2 nd cách tiếp cận :
Tôi sẽ tạo một bảng ElementType [idType, TypeName == some table name]
sẽ được quản trị viên (tôi) điền vào với tên của các bảng có thể được thích , nhận xét hoặc được gắn thẻ . Sau đó, tôi sẽ tạo các bảng :
a) LikedElement [idLike, idUser, idElementType, idLikedElement]
và tương tự cho Nhận xét và Thẻ với các cột thích hợp cho mỗi cột. Bây giờ, khi tôi muốn làm cho một bức ảnh thích, tôi sẽ chèn:
typeId = SELECT id FROM ElementType WHERE TypeName == 'Photo'
INSERT (user id, typeId, photoId)
và cho các địa điểm:
typeId = SELECT id FROM ElementType WHERE TypeName == 'Place'
INSERT (user id, typeId, placeId)
và v.v. ... Tôi nghĩ rằng cách tiếp cận thứ hai tốt hơn, nhưng tôi cũng cảm thấy như thiếu một cái gì đó trong thiết kế này ...
Cuối cùng, tôi cũng tự hỏi nơi tốt nhất để lưu trữ bộ đếm cho bao nhiêu lần yếu tố được thích là. Tôi chỉ có thể nghĩ về hai cách:
- trong
Photo/Article/Place
bảng phần tử ( ) - bằng cách chọn đếm ().
Tôi hy vọng rằng lời giải thích của tôi về vấn đề này kỹ lưỡng hơn bây giờ.