sco*_*ttm 6 sql-server database-design data-modeling normalization
我有活动和照片,然后评论两者.现在,我有两个评论表,一个用于与事件相关的评论,另一个用于照片评论.架构与此类似:
CREATE TABLE EventComments
(
CommentId int,
EventId int,
Comment NVarChar(250),
DateSubmitted datetime
)
CREATE TABLE PhotoComments
(
CommentId int,
PhotoId int,
Comment NVarChar(250),
DateSubmitted datetime
)
Run Code Online (Sandbox Code Playgroud)
我的问题是我是否应该将它们组合起来,并添加一个单独的交叉引用表,但我想不出有办法正确地做到这一点.我觉得这应该没事,你有什么想法?
编辑
根据沃尔特的回答(以及一些轻读),我想出了这个:
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)
Run Code Online (Sandbox Code Playgroud)
结构之间是否存在任何性能差异?对我来说,这似乎有点偏好.我确实看到了第二个模式的好处,如果我想为事件评论或照片评论添加一些特异性,我有一个单独的表来做,如果我想要两者共享一个新的属性,有一个表到添加新属性.
评论,PhotoComments和EventComments以称为"泛化专业化"的模式相关.此模式由面向对象语言中的简单继承处理.设置一个可捕获相同模式的表模式会更复杂一些.
但它很好理解.快速谷歌搜索"泛化专业化关系建模"将给你几个关于这个主题的好文章.