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

一个表和其他一些表之间的最佳关系,每个表取决于第一个表的n个数据集?[副本]

  •  0
  • okoman  · 技术社区  · 17 年前

    我有一个表,用于保存一组不同内容类型的注释。它们保存在其他表(新闻、文章、用户)中。 在以前的项目中,我为每种内容使用了第二个表。它们持有映射到comments表id的特定内容的id。因此,对于每个注释,我都有注释条目本身和“连接器”条目。 另一种方法是对任何类型的内容使用单独的注释表。 最后,这两种方法都包含一些冗余缺陷。

    4 回复  |  直到 9 年前
        1
  •  3
  •   Juliet    17 年前

    有几种明显的方法可以设计您的桌子:

    Comments
    --------
    ID
    
    News      NewsComments
    ----      ------------
    ID        NewsID
              CommentID
    
    Articles  ArticleComments
    --------  ---------------
    ID        ArticleID
              CommentID
    
    Users     UserComments
    -----     ------------
    ID        UserID
              CommentID

    这样做的优点是相对容易查询每个功能的注释。但是,这种风格会受到引用完整性的影响:可以将一条评论连接到多条评论、新闻文章和用户。此外,它的可伸缩性不是很强:如果为RSS提要、收藏夹链接、用户状态等添加注释,那么所有这些类型都有中间表。

    2) 另一种方法是稍微非规范化的版本:

    Comments
    --------
    ID
    TableName
    PkID (Connects the primary key in other tables)
    
    News
    ----
    ID  
    
    Articles
    --------
    ID
    
    Users
    -----
    ID

    3) 最后一个选项需要为每个功能提供大量冗余的“注释”表。

    News      NewsComments
    ----      ------------
    ID        NewsID
    
    Articles  ArticleComments
    --------  ---------------
    ID        ArticleID
    
    Users     UserComments
    -----     ------------
    ID        UserID

        2
  •  2
  •   tvanfosson    17 年前

    对于每个内容表,我可能会有一个单独的注释表,这样我就可以利用外键关系在更改/删除原始内容时自动管理更新/删除。所以如果我有新闻和文章表,那么我会有新闻评论和文章评论表。每一个都有一个content\u id字段和一个user\u id字段。content\u id字段将引用回content表,user\u id字段将引用回users表。我在适当的内容和注释表以及用户和每个注释表之间建立外键关系,并在更新/删除时传播更改。您可能还希望在id字段上设置索引,以便在它们之间进行索引联接。

    如果只有一个comments表,则必须在代码中手动管理关系,而不是让DB为您处理关系——因为您只能让FK与另一个表相关。

        3
  •  0
  •   Community Mohan Dere    9 年前
        4
  •  0
  •   Vilx-    17 年前

    Comments
    -------
    ID
    NewsID
    ArticleID
    UserID
    

    每行只有一个非零。这将使查询比使用中间表更简单。