【问题标题】:Foreign keys in first normal form?第一范式的外键?
【发布时间】:2020-02-09 13:17:36
【问题描述】:

我有一个蛋白质棒数据库。 这是我直觉得出的结论:



但我也想通过一步一步规范化来得出结论:

深灰色背景代表重复组。

问题:
在将表拆分为多个新表的最后一步中,我是否添加外键?还是在 2NF 中向新表添加外键?

产品原型可以在proteinbarinfo.com找到

【问题讨论】:

  • 请use text, not images/links, for text--including tables & ERDs。转述或引用其他文本。只提供您需要的东西并将其与您的问题联系起来。仅将图像用于无法表达为文本或增强文本的内容。无法搜索或剪切和粘贴图像。在图片中包含图例/键和说明。

标签: mysql database-design


【解决方案1】:

添加外键约束 发生在您创建依赖表的任何时候。这可能发生在标准化的任何阶段。

为了规范化,不需要向所有查找表添加数字伪键 (id)。您可以将字符串作为主键,也可以满足普通形式。

当您有多对多关系时,例如在 ProteinBars 和 Verified 类别之间,使用复合键创建一个表是合适的。

前三种范式有一个助记符:表中的每一列都必须依赖于键、整个键,并且除了键之外什么都没有。

像ProteinBar_has_Aroma 这样具有复合键且没有其他属性的表隐式满足所有三个条件:

  1. 由于两列都是主键的成员,它们必须依赖于主键。也就是说,对于一个给定的主键(即一对特定的值),你显然可以同时得到蛋白质棒和香气属性。

  2. 整个键 - 您需要整个主键才能找到给定的行,因此该表中的两列都依赖于整个主键。

  3. 只有键 - 没有任何其他(非键)属性列可供选择,因此它们只能依赖于键。

【讨论】:

  • @user644361 & BillKarwin “添加外键约束会在您创建依赖表的任何时候发生。这可能发生在规范化的任何阶段。” “add”没有被定义,但要做到这一点,它只适用于特殊情况。 “从属”没有定义,但是一旦我们生成一个不再分解的表,我们只能保证“添加”但以后不能“减去”如果我们不分解“确定”表或只分解它所涉及的 FK它在某些方面。特殊和一般情况没有解释。 (而且记忆法不够精确,无法推理。)请参阅我的答案。
【解决方案2】:

我们在完成分解为所需的最高 NF(范式)后确定 FK。 (请注意,分解为目标 NF 并不意味着我们会通过较低的 NF。我们使用适当的算法。)

每个二进制无损分解都会将至少一个 FK(外键)从一个组件引入另一个组件。 (从任何 NF 到任何 NF。任何组件的 NF 是否高于或低于原始或其他。)

(为什么?组件是原始的投影,因此它们具有与每列中相同的值。此外(根据基本归一化定理)当/当且仅当组件的公共列是其中一个表的 CK(候选键)的超集。因此,从一个组件到另一个 CK 至少有一个 FK。可能有更多 FK。)

但是,如果我们继续进行更多分解以仅获得目标 NF 中的组件,那么这两个组件不会同时出现在最终设计中,因此它们之间也不会包含任何 FK。

此外,一些无损分解不能通过二进制分解的组合来表示,并且可能不会引入 FK。 (同样,不管模式的 NF 是什么。)这些是用于规范化到 4NF 以上的分解。 (与 5NF 的常见说法相反,这些是重要的理想分解,它们不需要经常使用的唯一原因是违规设计大多明显很糟糕,以至于我们不考虑它们。)

因此,我们必须确定最终设计的 FK 和其他约束。 (如果最后的分解是二元的,那么至少会有一个 FK。)

PS 规范化到更高的 NF 不会引入新的列名,特别是 id。它将关系模式替换为其他具有连接回它的列的适当子集的关系模式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-11
    • 2015-04-22
    • 2014-03-27
    • 2015-02-05
    • 1970-01-01
    • 2015-09-18
    • 2015-04-28
    • 2013-03-26
    相关资源
    最近更新 更多