2012-11-21 27 views
5

Tôi muốn tạo hai bảng một với các chú thích và một với các câu trả lời, với mối quan hệ một đến nhiều giữa chúng. Nhưng nếu họ cũng có thể trả lời các câu trả lời, thì nó sẽ thay đổi như thế nào? Đây là những gì tôi có cho một đến nhiều, nhưng tôi không biết làm thế nào nó nên xem xét nếu có cũng có thể được trả lời cho một trả lời.Thiết kế cơ sở dữ liệu cho các nhận xét và trả lời

Comments: 
• Id 
• Title 
• Text 

    Replies: 
• Id 
• Title 
• Text 
• Comment id 

Xin cảm ơn trước.

+0

Bạn thiết kế được chuẩn hóa, bạn có thể tiếp tục với nó. Bạn phải có userId, đây sẽ là id của người tạo trong cả hai bảng. Câu trả lời thứ hai để trả lời là một kịch bản logic, việc thực hiện nó giống như bạn có trạng thái mà mọi người trả lời –

+0

UserId? 'Người dùng' được tham chiếu ở đâu? – mcalex

Trả lời

11

Bạn chỉ có thể sử dụng một bảng, bao gồm trường ParentID. Nếu bản ghi không có giá trị, nó là một bình luận, nếu không nó là một câu trả lời (cho một bình luận hoặc trả lời).

Bạn có thể truy vấn hồ sơ ParentID của hồ sơ (kiểm tra đó là ParentID) để xem câu trả lời này là nhận xét hay trả lời.

Chỉnh sửa: Trên đây là một giải pháp khá thiết thực. Tuy nhiên, để đi với một phiên bản bình thường, vẫn giữ một bảng Bình luận (không có ParentID), và tạo một bảng ReplyTo có một CommentID và một ResponseID, cả hai đều là các ID của các bản ghi trong bảng Nhận xét.

Sử dụng ý tưởng này, sql sau sẽ hiển thị các nhận xét và 'reply' cho mỗi nhận xét cho từng trả lời rằng có một lời nhận xét:

select c.comment, r.comment as reply 
from comment as c, comment as r, replyto as rt 
where c.ID = rt.CommentID 
and r.ID = rt.ReplyID 

Như Dimitrii chỉ ra, nó sẽ không hiển thị bình luận với không có câu trả lời - cho điều này bạn cần truy vấn tham gia bên ngoài (không thử cú pháp):

SELECT c.comment, r.comment as reply, 
from Comment c 
    left outer join Comment r on c.id = r.id 
    left outer join replyto rt on rt.responseid = r.id 
+0

Anh ấy có thể, nhưng thiết kế của anh ấy được chuẩn hóa hơn ... –

+1

Tôi đồng ý với mcalex. Tách nó trên 2 bảng dường như không cần thiết phức tạp mà không có bất kỳ lợi ích nào. Nếu có một trường hợp chia nó trên nhiều bảng vì lý do bình thường thì có một bảng các chủ đề, và sau đó là một bảng các bình luận (cả bình luận và trả lời gốc). Tuy nhiên thực hiện bình thường nó sẽ yêu cầu đệ quy các cuộc gọi đến cơ sở dữ liệu để nhận được trả lời, sau đó trả lời trả lời, vv Có thể được thực hiện bằng cách sử dụng mô hình tập lồng nhau. – Kickstart

+0

cảm ơn alex, tôi nghĩ rằng cả hai giải pháp sẽ làm việc tốt, nhưng trong kinh nghiệm của bạn mà một trong những bạn nghĩ rằng sẽ cung cấp hiệu suất tổng thể tốt hơn? – grasshopper

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