Tôi đang làm việc trên trang web hiện cần có hệ thống nhận xét. Vì trang web này là thương hiệu mới và cấu trúc cơ sở dữ liệu chưa được đặt trong đá, tôi muốn một số đề xuất về cách xử lý tốt nhất hệ thống nhận xét như sau:Cấu trúc cơ sở dữ liệu cho hệ thống nhận xét trang web
- Nhận xét phải được đặt lên bất cứ điều gì. Bao gồm các mục trong bảng trong tương lai.
- Nhận xét phải nhanh chóng (và dễ dàng?) Có thể truy vấn.
Tôi biết rằng điều này một mình không nhiều, vì vậy đây là ý tưởng: Mỗi trường đại học có Cao đẳng, mỗi trường đều có tòa nhà và mỗi tòa nhà đều có phòng. Mọi người dùng đều có thể nhận xét về bất kỳ mục nào trong số bốn mục này (và những mục tương lai mà chúng tôi có thể thêm sau), nhưng tôi muốn tránh tạo một bảng bình luận cho từng mục.
Giải pháp mà tôi đã đưa ra cho đến nay dường như có hiệu quả, nhưng tôi cũng mở ra các ý tưởng khác. Giải pháp của tôi là sử dụng UUID làm khóa chính cho mỗi bảng (trường đại học, cao đẳng, xây dựng, phòng), sau đó có id tham chiếu trong bảng nhận xét là UUID đó. Mặc dù tôi không nghĩ rằng tôi có thể tạo một hệ thống khóa ngoài để liên kết mọi thứ, tôi tin rằng không có gì sẽ phá vỡ vì chỉ có các mục có thể có nhận xét, do đó một mục có thể không có nhận xét hoặc nếu nó bị xóa, thì bình luận đơn giản sẽ không bao giờ được trả lại.
University:
UniversityID - CHAR(36) //UUID() & primary key
...
Comments:
CommentID - CHAR(36) //UUID() & primary key
CommentItemID - CHAR(36) //UUID of item & indexed
CommentUserID - INTEGER
CommentBody - TEXT
Và sau đó truy vấn sẽ xuất hiện như:
SELECT * FROM University, Comments WHERE UniversityID = CommentItemID;
Vậy điều gì làm tất cả các bạn nghĩ sao? Quy mô hệ thống này sẽ có số lượng lớn dữ liệu, hay có cách nào tốt hơn (có thể là Phương pháp hay Thực hành tốt nhất)?
Tôi cảm ơn bạn trước.
Chỉnh sửa 1: Tôi đã thay đổi định nghĩa Nhận xét để bao gồm một khóa chính và cột được lập chỉ mục để giải quyết các vấn đề được nêu từ trước đến nay. Bằng cách này, hệ thống cũng có thể có ý kiến nhận xét (không chắc chắn làm thế nào khó hiểu điều này sẽ được trong mã thực tế, nhưng nó có một tính toán nhất định toán học để nó mà tôi thích). Tôi muốn giữ cho hệ thống càng giống càng tốt cho đến khi tôi chấp nhận câu trả lời.
Cả hai câu trả lời cho đến nay bởi Sebastian Good và Bryan M. đã đề xuất một khóa chính kép của hai số nguyên giống như ItemID và TableID. Sự do dự duy nhất của tôi với phương thức này là tôi sẽ phải có một bảng mới liệt kê các TableID và các tên bảng chuỗi sửa lỗi của chúng, hoặc giới thiệu các biến toàn cầu vào mã của tôi tham chiếu chúng. Trừ khi có một phương pháp khác tôi bị mất, điều này có vẻ như mã phụ có thể tránh được với tôi.
Tất cả các bạn nghĩ gì?
Tôi không biết liệu mysql có hỗ trợ trình kích hoạt hay không ... nhưng nếu có thì bạn có thể tạo trình kích hoạt do người dùng xác định để giúp tính toàn vẹn tham chiếu: chẳng hạn như khi một trường đại học (ví dụ) bị xóa. xóa bất kỳ nhận xét được liên kết nào có thể tồn tại. – ChrisW
Có MySQL không hỗ trợ trình kích hoạt và đây là giải pháp hợp lệ để cắt kích thước của cơ sở dữ liệu mà trước đó tôi chưa từng nghĩ đến. Tuy nhiên, câu hỏi của tôi là chất lượng của giải pháp mà tôi đã nghĩ ra. Tôi hy vọng cộng đồng có thể giúp tôi tìm ra giải pháp tối ưu. – Mike
Tôi không thấy có vấn đề với cách tiếp cận của bạn, tiết kiệm cho việc bảo tồn các mối quan hệ khóa ngoại. Tôi đã thực sự thực hiện một cách tiếp cận tương tự trong quá khứ với id tự động tăng - điều này sau đó đòi hỏi một trường 'loại' bổ sung có chứa tên bảng của khóa ngoại. – BrynJ