【问题标题】:Database normalization - how deep should I link tables together?数据库规范化 - 我应该将表链接到多深?
【发布时间】:2011-01-25 00:46:38
【问题描述】:

我有三个表:Post、Attachment 和 Media。

帖子有附件,附件有媒体。

目前,Post 和 Attachment 表通过外键链接,Attachment 和 Media 表也是如此。我的问题是,为了正确的数据库设计和规范化,我应该在 Post 和 Media 之间设置外键关系吗?我不确定我应该将这些表链接到多深。

谢谢

【问题讨论】:

  • 我不确定我是否理解您的问题。我不认为帖子的类型会根据帖子附件所具有的媒体而改变。在这种情况下,如果 Post 和 Media 之间没有直接关系,也许不需要外键关系?
  • 附件可以存在于多个帖子上吗?
  • 请不要发表评论。请使用人们回答问题所需的信息更新问题。请更新问题并删除您的 cmets。

标签: database-design normalization database-normalization


【解决方案1】:

尽可能深地链接表。在报告和发现性能问题后进行非规范化。

【讨论】:

    【解决方案2】:

    我认为你没问题。

    似乎一个 POST 可以有多个 ATTACHMENT,一个 ATTACHMENT 可以有多个 POST,如果是这样,您将需要第三范式的链接实体:

      Post
    
        |
        |
      -----
      | | |
    
    Post_Attachment
    
      | | |
      -----
        | 
        |
    
    Attachment
    
        |
        |
      -----
      | | |
    
      Media
    

    但从你的描述来看,POST和MEDIA之间似乎没有关键关系。

    【讨论】:

      【解决方案3】:

      不,对于像3NF 这样深度的标准化,您所关心的是,这是通常的标准化级别,结构还可以。

      因为记录规范化既有成本也有好处,特别是在数据插入和删除方面,主要水平控制精确地控制插入方式和插入内容。

      规范化和非规范化需自担风险:)

      【讨论】:

        【解决方案4】:

        为了正确的数据库设计和规范化,我应该在 Post 和 Media 之间设置外键关系吗?

        对于“正确的规范化”,您必须确保没有“更新异常”。

        如果有人更新帖子,附件和媒体会怎样?重命名帖子会断开附件和/或媒体吗?如果是这样,那么您的 FK 是错误的。 [提示,您必须使用代理键而不是帖子名称来使您的 FK 工作。]

        如果有人想将附件从一个帖子“移动”到另一个帖子[即更新附件的 FK 引用],媒体会发生什么?它是否保留在附件中并移至新帖子?

        你能不能让 Post 有附件和媒体,以及 Attachments 有媒体?帖子和附件是否会因为附件被“移动”但帖子没有更新而对媒体存在分歧?

        如果你可以有矛盾,你已经打破了第二范式并且你有重复的关键关系,你不应该重复。

        适当的标准化很容易。

        数据取决于密钥,只有密钥。

        不要在任何地方复制或重复依赖项。您所说的“深度链接”似乎是依赖关系的重复。

        【讨论】:

        • 从我的角度来看,所有这些假设都是业务逻辑问题。底层结构代表某些假设和关系(帖子可能有附件,附件可能有媒体文件或没有)。我认为这就是他的想法,因此它被规范化了。
        • 您关于将附件从一个帖子“移动”到另一个帖子的评论让我想起了这个问题。谢谢! (现在是时候阅读书籍并找出代理键是什么了;))
        • @豪尔赫科尔多瓦。我认为“业务逻辑”是数据库必须代表的。除了必须支持的“业务逻辑”之外,我看不出还有什么“底层结构”。
        【解决方案5】:

        将 FK 从媒体添加到帖子的唯一原因是您需要为特定帖子过滤或选择媒体而不考虑附件。即使您需要显示媒体(可能按类型)及其所属的帖子,我也不会添加直接关联;添加第二个连接(通过附件表)的开销可能很小,因此您不太可能看到任何重大改进。

        【讨论】:

          【解决方案6】:

          首先,您不需要使用代理键。如果您愿意,适当的数据库将级联更新。在规范化数据库时,您通常会尝试实现第 3 范式甚至 BCNF。第二范式并不总能保护您的数据免受更新异常的影响。一旦生成 ER 图并确定哪些数据是实体(帖子、附件、媒体)的一部分以及哪些数据是关系的一部分,确定架构中的功能依赖关系应该很简单。根据关系的基数,您可能需要也可能不需要连接表。最好的办法是在图表中对数据进行建模,然后处理实施问题。

          【讨论】:

          • 使用级联更新。多么可怕的建议。当您需要更新 10,000 行包含数百万条关联记录时,您知道效果吗?这是一个被锁定数小时的数据库,任何人都无法使用。级联更新是不好的做法。
          • 数百万条关联记录?这听起来像是一个糟糕的设计。级联更新是完全合理的。在任何健全的数据库中,它们都不会锁定表。
          猜你喜欢
          • 2015-10-30
          • 2018-07-08
          • 2020-05-08
          • 2011-05-18
          • 2011-02-06
          • 2011-11-12
          • 2013-07-26
          • 2017-01-27
          • 2016-06-06
          相关资源
          最近更新 更多