2009-09-25 28 views
6

Tôi có các sự kiện và ảnh và sau đó là nhận xét cho cả hai. Ngay bây giờ, tôi có hai bình luận bảng, một cho ý kiến ​​liên quan đến các sự kiện, và một cho ý kiến ​​hình ảnh. Schema là tương tự như sau:Khi hai bảng rất giống nhau, khi nào chúng nên được kết hợp?

CREATE TABLE EventComments 
(
    CommentId int, 
    EventId int, 
    Comment NVarChar(250), 
    DateSubmitted datetime 
) 

CREATE TABLE PhotoComments 
(
    CommentId int, 
    PhotoId int, 
    Comment NVarChar(250), 
    DateSubmitted datetime 
) 

Câu hỏi của tôi là có hay không tôi nên kết hợp chúng, và thêm một bảng tham chiếu chéo riêng biệt, nhưng tôi không thể nghĩ ra một cách để làm điều đó đúng. Tôi nghĩ điều này sẽ ổn thôi, suy nghĩ của bạn là gì?

Sửa

Dựa trên câu trả lời của Walter (và một số ánh sáng đọc), tôi đã đi lên với điều này:

CREATE TABLE Comments 
(
    CommentId int, 
    Comment NVarChar(250), 
    DateSubmitted datetime 
    CONTRAINT [PK_Comments] PRIMARY KEY 
    (
    CommentId 
) 
) 

CREATE TABLE EventComments 
(
    CommentId int, 
    EventId int 
) 

CREAT TABLE PhotoComments 
(
    CommentId int, 
    PhotoId int 
) 

ALTER TABLE EventComments ADD CONSTRAINT FK_EventComments FOREIGN KEY (CommentId) REFERENCES Comments(CommentId) 

ALTER TABLE PhotoComments ADD CONSTRAINT FK_PhotoComments FOREIGN KEY (CommentId) REFERENCES Comments(CommentId) 

Có thực sự bất kỳ sự khác biệt về hiệu năng giữa các cấu trúc? Đối với tôi, nó có vẻ như một chút ưu tiên. Tôi thấy lợi ích trong lược đồ thứ hai, nếu tôi muốn thêm một số tính năng vào nhận xét sự kiện hoặc nhận xét ảnh, tôi có một bảng riêng để làm như vậy và nếu tôi muốn cả hai chia sẻ một thuộc tính mới, có một bảng thêm thuộc tính mới.

Trả lời

9

Nhận xét, PhotoComments và EventComments có liên quan trong một mẫu gọi là "chuyên môn hóa tổng quát". Mẫu này được xử lý bởi sự kế thừa đơn giản trong các ngôn ngữ hướng đối tượng. Đó là một chút phức tạp hơn để thiết lập một lược đồ của các bảng sẽ chụp cùng một mẫu.

Nhưng nó được hiểu rõ. Tìm kiếm nhanh trên google về "mô hình hóa quan hệ hóa chuyên môn hóa tổng quát" sẽ cung cấp cho bạn một số bài viết hay về chủ đề này.

+0

Nhận xét thiết kế thuần túy tốt nhất trên trang, IMHO. – Rap

+0

Tôi đã thực hiện một số nghiên cứu và cập nhật câu hỏi.Cảm ơn cho các đầu vào – scottm

+0

Tôi mạnh mẽ không đồng ý với câu trả lời này; trong thực tế, bạn đang cầu xin cho dữ liệu không phù hợp, lộn xộn. Nhận xét bị xóa như thế nào? Tôi thường xuyên thấy nó được thiết lập như ScottM đã thực hiện nó trong câu hỏi đã được sửa lại, và hầu như luôn luôn bình luận trong phần Bình luận, nhưng hồ sơ liên quan trong EventComments hoặc PhotoComments bị xóa, và bạn đã để lại một bản ghi đáng chú ý trong phần bình luận. – JasonFruit

1

Bạn có thể kết hợp chúng và thêm trường cho biết đó là trường cho ảnh hoặc sự kiện.

Bạn sẽ cần hai khóa ngoại; một cho hình ảnh và một cho các sự kiện, nhưng có chúng trong một bảng cho phép bạn viết một bộ mã duy nhất để xử lý tất cả các nhận xét.

Nhưng tôi bị rách. Nó là sạch hơn nếu bạn giữ chúng riêng biệt, miễn là bạn không bao giờ phải trộn hai loại bình luận trong cùng một danh sách (mà sẽ yêu cầu một UNION).

+0

Làm cách nào để sau đó xác định ảnh hoặc sự kiện nào nhận xét được gắn kết và vẫn đảm bảo tính toàn vẹn tham chiếu? – scottm

+0

Tôi đồng ý rằng một phần của nó phức tạp hơn một chút. –

1

Kiểu thiết kế cá nhân của riêng tôi sẽ kết hợp chúng, sau đó thêm cờ nguyên để cho biết nhận xét là gì. Điều đó cũng sẽ cho tôi khả năng mở rộng trong trường hợp tôi muốn thêm sau này.

4

Nếu bạn kết hợp chúng sẽ làm hỏng cấu trúc khóa. Bạn sẽ phải có các khóa ngoài không có khả năng rỗng hoặc cấu trúc khóa "mềm" của khóa và loại. Tôi sẽ giữ chúng riêng biệt.

+0

Vâng, đó là vấn đề tôi đã chạy vào – scottm

+1

Chúng liên quan đến hai "thực thể" khác nhau Tôi không nghĩ rằng chúng thuộc về nhau – Gratzy

+0

Mặc dù chúng có liên quan đến các thực thể khác nhau, chúng đều là bình luận. – scottm

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