6

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

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

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

我的问题是我是否应该将它们组合起来,并添加一个单独的交叉引用表,但我想不出一种正确的方法。我认为这应该没问题,你的想法是什么?

编辑

根据沃尔特的回答(以及一些简单的阅读),我想出了这个:

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)

结构之间真的有任何性能差异吗?对我来说,这似乎有点偏好。我确实看到了第二种模式的好处,如果我想为事件评论或照片评论添加一些特殊性,我有一个单独的表来执行此操作,如果我希望两者共享一个新属性,则有一个表可以添加新属性。

4

4 回答 4

9

Comments、PhotoComments 和 EventComments 以一种称为“泛化专业化”的模式相关联。这种模式是通过面向对象语言中的简单继承来处理的。设置将捕获相同模式的表模式稍微复杂一些。

但是很好理解。在“泛化专业化关系建模”上的快速谷歌搜索将为您提供有关该主题的几篇好文章。

于 2009-09-25T16:13:23.690 回答
4

如果你把它们结合起来,就会弄乱关键结构。您将必须具有可以为空的外键或键和类型的“软”键结构。我会把它们分开。

于 2009-09-25T15:54:02.260 回答
1

您可以将它们组合起来并添加一个字段来指示它是用于照片还是事件。

您将需要两个外键;一个用于照片,一个用于事件,但将它们放在一个表中允许您编写一组代码来处理所有评论。

但我被撕裂了。如果你把它们分开会更干净,前提是你永远不必在同一个列表中混合两种评论类型(这需要一个 UNION)。

于 2009-09-25T15:52:07.070 回答
1

我自己的个人设计风格是将它们组合起来,然后添加一个整数标志来说明评论的用途。如果我以后想添加更多内容,这也将给我提供可扩展性。

于 2009-09-25T15:53:05.053 回答