代码之家  ›  专栏  ›  技术社区  ›  scottm

当两个表非常相似时,它们应该在什么时候合并?

  •  6
  • scottm  · 技术社区  · 16 年前

    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 回复  |  直到 16 年前
        1
  •  9
  •   Walter Mitty    16 年前

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

    但这是众所周知的。在google上快速搜索“泛化-专业化-关系建模”将为您提供关于该主题的几篇好文章。

        2
  •  4
  •   Tom H zenazn    16 年前

        3
  •  1
  •   Robert Harvey    16 年前

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

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

    但是我很伤心。如果你不必在同一个列表中混合这两种注释类型(这需要一个联合),那么将它们分开会更干净。

        4
  •  1
  •   Tom A RRUZ    16 年前

    我个人的设计风格是将它们结合起来,然后添加一个整型标志来说明注释的用途。这也会给我可伸缩性,以防我以后想添加更多。

    推荐文章