2009-05-12 40 views
6

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ì?

+0

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

+0

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

+0

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

Trả lời

0

Vâng, vì không ai muốn trả lời, tôi đoán tôi sẽ chỉ gắn bó với phương pháp của mình. Tuy nhiên, tôi vẫn sẽ mở để đưa ra các đề xuất khác.

+0

Bạn mong đợi câu trả lời trong một ngày? – JeffO

+0

Sau khi đăng bình luận này, quan điểm của tôi gần gấp bốn lần. Tôi thấy rằng sau một ngày hầu như không ai đã xem nó và tôi không thể tìm thấy nó từ các trang chính. Dường như nó đã bị mất vào sự tối tăm, vì vậy tôi đã đăng một câu trả lời để cố gắng đưa nó lên một nơi nào đó mà người khác có thể nhìn thấy. Nó dường như đã từng làm việc. Tuy nhiên, tôi sẽ không chấp nhận câu trả lời của tôi làm giải pháp. – Mike

+0

Bạn có thể vừa chỉnh sửa bài đăng của mình. Tôi khuyên bạn nên làm điều đó thay vào đó và chỉ cần xóa câu trả lời này. –

3

Tôi sẽ chỉ thực hiện một cách tiếp cận truyền thống hơn đối với mối quan hệ khóa ngoại giữa các nhận xét và bất cứ điều gì họ đang bị ràng buộc.

UNIVERSITY 
    UniversityID // assuming primary key 

COMMENTS 
    CommentID // assuming primary key 
    TypeID // Foreign Key 
    Type // Name of the table where the foreign key is found (ie, University) 

Điều này chỉ cảm thấy một chút sạch hơn với tôi. Một số cách sử dụng khóa ngoại của một bảng khác làm khóa chính cho nhận xét của bạn không cảm thấy đúng.

+0

Điểm Excel! Tôi đồng ý rằng việc sử dụng trường tôi không chính xác có tiêu đề CommentID là khóa chính không phải là một ý tưởng hay. Nó thực sự là những gì tôi đã suy nghĩ, nhưng nó đã được sai lầm logic như bạn đã chỉ ra. Tôi đã cập nhật câu hỏi một cách thích hợp để giữ cho cùng một logic của tôi trong khi sửa chữa vấn đề quan trọng chính. – Mike

3

Nếu bạn sử dụng UUID, thật khó để biết nó xuất phát từ bảng nào. Nếu bạn chỉ muốn nhìn từ thực thể xuống các nhận xét, như trong truy vấn của bạn, nó sẽ hoạt động được. Nếu bạn muốn xem xét một bình luận và tìm hiểu nó là gì, bạn sẽ phải xem xét tất cả các bảng có thể (các trường đại học, các tòa nhà, vv) để tìm hiểu.

Một khả năng cho phép bạn sử dụng các số nguyên tuần tự đơn giản cho các khóa của các thực thể cơ sở của bạn (thường là mong muốn cho khả năng đọc, phân mảnh chỉ mục, v.v.) để làm cho khóa của bảng bình luận của bạn chứa hai cột. Một là tên của bảng mà nhận xét áp dụng cho. Thứ hai là chìa khóa của bảng đó. Điều này tương tự như cách tiếp cận mà Bryan M. gợi ý, mặc dù lưu ý rằng bạn sẽ không thể xác định các khóa ngoại từ bảng bình luận cho tất cả các bậc cha mẹ có thể. Truy vấn của bạn sẽ làm việc theo cả hai cách nếu cần, và bạn không cần phải lo lắng về UUID, vì sự kết hợp của tên bảng + ID sẽ là duy nhất trên cơ sở dữ liệu.

+0

Đó là một điểm rất tốt mà tôi sẽ phải xem xét thêm để đảm bảo không có trường hợp nào khác mà tôi phải truy xuất mục từ nhận xét, nhưng hiện tại, trường hợp sử dụng chỉ hiển thị nhận xét khi xem một mục cụ thể mục. – Mike

Các vấn đề liên quan