【问题标题】:Is there an answer matrix I can use to decide if I need a foreign key or not?是否有一个答案矩阵可以用来决定我是否需要外键?
【发布时间】:2010-12-31 02:13:58
【问题描述】:

例如,我有一个存储类的表和一个存储类属性的表。 class_attributes 有一个 class_attribute_id 和一个 class_id,而 classes 有一个 class_id。

我猜如果一个数据集是“一个单独的孩子”或“单独属于”或“单独拥有”,那么我需要一个 FK 来识别父级。如果没有 class_attributes 表中的 class_id,我永远无法找出该属性属于哪个类。

也许有一个有用的答案矩阵?

【问题讨论】:

    标签: database database-design normalization database-normalization


    【解决方案1】:

    我没有答案矩阵,但为了澄清起见,我们正在谈论数据库规范化

    http://en.wikipedia.org/wiki/Database_normalization

    并且在一定程度上去规范化

    http://en.wikipedia.org/wiki/Denormalization

    【讨论】:

      【解决方案2】:

      Wikipedia 很有帮助。

      在关系的上下文中 数据库,外键是 两者之间的参照约束 tables.1外键标识 一列或一组列 (引用)引用一个表 另一列或一组列 (参考)表。中的列 引用表必须是主表 键或其他候选键 引用表。

      (它会越来越详细)

      如果要强制执行 class_attributes 中的每一行仅适用于一行类的约束,则需要一个外键。如果您不关心强制执行此操作(即,您可以拥有不存在的类的属性),则不需要 FK。

      【讨论】:

        【解决方案3】:

        不要关心关系的类型——它更多地与关系的基数有关。

        如果您有一对多的关系,那么您希望将主键分配给较小的表,并将其作为外键存储在较大的表中。

        你也可以在一对一的关系中这样做,但有些人认为你应该避免它们。

        在多对多关系的情况下,您需要创建一个连接表,然后让每个原始表都有一个连接表的外键。

        【讨论】:

          【解决方案4】:

          我会说,情况正好相反。首先,你设计你需要什么样的对象。对于那些将创建一个表。

          此阶段的一部分是设计键,即唯一标识对象的属性(列)组合。出于方便或性能原因,您可能会也可能不会添加人工密钥或代理密钥。从这些键中,您通常会选择一个规范键,即主键,您尝试一致地使用它来识别该表中的对象(您也保留其他键,它们用于确保作为业务规则的唯一性,而不是用于识别目的。)

          然后,您认为对象之间存在哪些关系。由另一个对象“拥有”的对象或引用另一个对象的对象需要某种方式来标识其相关对象。在相应的表(子表)中添加列以使外键指向被引用表的主键。

          这会处理所有一对多关系。

          有时,一个对象可以与另一个对象多次关联。例如,一个订单可用于订购多个产品,但一个产品也可以出现在多个订单上。对于这些关系,您需要设计一个单独的表(交叉表 - 在本例中为 order_items)。该表将具有从两个外键创建的唯一键:一个指向一个父级(订单),一个指向另一个父级(产品)。再次,您将列添加到创建这些外键所需的交集表中。

          简而言之,您首先设计键和外键,然后才开始添加列来实现它们。

          【讨论】:

          猜你喜欢
          • 2012-08-22
          • 2016-02-04
          • 1970-01-01
          • 2021-07-21
          • 2013-06-17
          • 2021-08-29
          • 1970-01-01
          • 2010-09-21
          • 1970-01-01
          相关资源
          最近更新 更多