Database design 数据库规范化-我应该将多深的表链接在一起?

Database design 数据库规范化-我应该将多深的表链接在一起?,database-design,normalization,database-normalization,Database Design,Normalization,Database Normalization,我有三个表:Post、Attachment和Media 帖子有附件,附件有媒体 目前,Post表和附件表是通过外键链接的,附件表和介质表也是如此。我的问题是,为了正确的数据库设计和规范化,我应该在Post和媒体之间设置外键关系吗?我不确定我应该将这些表链接到多深 谢谢尽可能深入地链接表格。在看到性能问题后,对报告进行非规范化。我认为您还可以 一篇文章可能有多个附件,一篇附件可能有多篇文章,如果是这样,您将需要一个链接实体作为第三个标准表单: Post | | -----

我有三个表:Post、Attachment和Media

帖子有附件,附件有媒体

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


谢谢

尽可能深入地链接表格。在看到性能问题后,对报告进行非规范化。

我认为您还可以

一篇文章可能有多个附件,一篇附件可能有多篇文章,如果是这样,您将需要一个链接实体作为第三个标准表单:

  Post

    |
    |
  -----
  | | |

Post_Attachment

  | | |
  -----
    | 
    |

Attachment

    |
    |
  -----
  | | |

  Media

但是从您的描述来看,POST和媒体之间似乎没有关键的关系。

不,对于您所关心的深度规范化,即通常的规范化级别,结构是正常的

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


规范化和非规范化风险自负:)

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

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

如果有人更新帖子,附件和媒体会发生什么变化?重命名post是否会断开附件和/或媒体的连接?如果是这样,那么你的FK是错误的。[提示,您必须使用代理密钥,而不是帖子的名称,才能使您的FK工作。]

如果有人想将附件从一篇文章“移动”到另一篇文章[即更新附件的FK引用],媒体会发生什么情况?它是否保留在附件中并移动到新的职位

你会不会觉得帖子有附件和媒体,附件也有媒体?帖子和附件是否会因为附件已“移动”但帖子未更新而对媒体产生分歧

如果你可以有矛盾,你已经打破了第二个正常形式,你有重复的关键关系,你不应该重复

适当的规范化很容易

数据取决于键,只取决于键。


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

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

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

我不确定我是否理解你的问题。我不认为职位的类型是根据媒体的帖子来改变的。在这种情况下,如果帖子和媒体之间没有直接关系,那么可能不需要外键关系?可以在多篇帖子上存在附件吗?请不要评论。请用人们回答问题所需的信息更新问题。请更新问题并删除您的评论。在我看来,所有这些都是商业逻辑问题。底层结构表示某些假设和关系(帖子可能有附件,附件可能有媒体文件或没有)。我想这就是他所想的,并且是正常化的。你关于将附件从一个帖子“移动”到另一个帖子的评论让我明白了这一点。谢谢(现在是时候好好读书,弄清楚什么是代理键了;)@Jorge Córdoba。我认为数据库必须表示“业务逻辑”。我看不出除了“业务逻辑”之外,还有什么“底层结构”必须得到支持。一定要使用级联更新。多么可怕的建议。您知道当您需要更新10000行(其中包含数以百万计的关联记录)时的效果吗?这是一个被锁定数小时的数据库,没有人可以使用。级联更新是一种糟糕的做法。数百万条相关记录?这听起来像是个糟糕的设计。级联更新是完全合理的。在任何sane数据库中,它们都不会锁定表。