sql-server - 当两个表非常相似时,应何时将它们合并?

标签 sql-server database-design data-modeling normalization

我有 Activity 和照片,然后都有评论。现在,我有两个评论表,一个用于与事件相关的评论,另一个用于照片评论。架构与此类似:

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

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

我的问题是是否应该合并它们,并添加一个单独的交叉引用表,但是我想不出一种适当的方法。我认为应该没问题,您对此有何看法?

编辑

根据Walter的回答(和一些浅读),我得出了以下结论:
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)

这些结构之间确实存在性能差异吗?对我来说,似乎有点偏爱。我确实在第二个方案中看到了好处,如果我想为事件注释或照片注释添加一些特殊性,则可以使用一个单独的表来完成,如果我要共享一个新属性,则可以使用一个表来完成。添加新属性。

最佳答案

评论,照片评论和事件评论以称为“通用化专门化”的模式关联。此模式通过面向对象语言中的简单继承来处理。设置将捕获相同模式的表的架构要复杂一些。

但这是众所周知的。谷歌快速搜索“泛化特化关系建模”将为您提供有关该主题的好几篇文章。

关于sql-server - 当两个表非常相似时,应何时将它们合并?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1478112/

相关文章:

sql - 使用电子邮件地址作为主键?

database - 如何在 Cassandra 中建模数据以避免无用的重复

sql - Oracle 中的外键约束

sql - 游标与 While 循环 - SQL Server

sql-server - varchar(5) 和 varchar(5000) 的区别?

database - 在数据库列中存储分隔列表真的那么糟糕吗?

mongodb - 将聊天消息存储在 mongodb 集合中是个好主意吗?

sql - 简单的数据库表设计/布局

sql - 如何从 DDL 触发器获取 ALTER 之前的过程文本

php - 让 Microsoft PHP PDO for SQL Server 工作