1

我的问题或多或少与这个问题相反:当使用序列作为代理时,为什么要费心在关系中寻找自然主键似乎容易得多。

BradC对相关问题的回答中提到,选择主键的标准是唯一性、不可约性、简单性、稳定性和熟悉性。在我看来,使用序列牺牲了最后一个标准,以便为前四个提供最佳解决方案。

如果我认为这些标准是正确的,我可以将我的问题重新表述为:在哪些情况下,人们会认为通过寻找一把独特的、不可还原的、简单而稳定的、同样熟悉的钥匙来使自己的生活复杂化是有利的?

4

4 回答 4

5

从查找表中获取有意义的值而不进行不必要的连接。

示例案例: garments引用具有自动递增主键的颜色查找表。获取颜色的名称需要一个连接:

SELECT c.color
FROM garments g
JOIN colors c USING (color_id);

更简单的示例:它colors.color本身是该表的主键,因此它是引用它的任何表中的外键列。

SELECT g.color
FROM garments g
于 2013-10-02T16:27:18.630 回答
4

答案是数据完整性。数据库之外的业务域中的实体实例根据定义是可识别的事物。如果您未能在数据库中为他们提供外部的、真实的世界标识符那么该数据库几乎没有机会正确地对现实进行建模。

自然键 [1] 是确保数据库中的事实可以与您尝试建模的现实中的实际事物相识别的要素。它们是用户在操作和更新数据库中的数据时所依赖的手段。强制执行这些键的约束是业务规则的实现。如果您的数据库要准确地为业务领域建模,那么自然键不仅是可取的,而且是必不可少的。如果您对此表示怀疑,那么您还没有进行足够的业务分析。只需询问您的客户,如果他们看着满是重复数据的屏幕,他们认为他们的业务将如何运作!

[1] 我建议称它们为业务密钥或密钥,而不是自然密钥。尽管它们的含义完全相同,但它们是更合适且更少重载的术语。

于 2013-10-02T18:59:46.923 回答
2

您通常需要确定数据上的唯一键是什么,因为您仍然需要能够确保数据不重复。

合成密钥的优势在于它允许将来修改唯一自然密钥的值,而无需更新子记录。

因此,您并没有真正通过使用合成主键跳过设计的“识别键”部分,您只是将自己与值更改的可能性隔离开来。

于 2013-10-02T17:07:41.387 回答
0

以下是使用自然主键的好处:

  • 如果您需要对任何列进行唯一约束,那么将其设为主键将满足这一需求,如果您不打算在其中接收任何空值。因此,无论如何,它可以节省 1 个额外键的成本。

  • 在某些 RDBMS 中,您声明为主键的键会自动在该列上创建一个 btree 索引,如果您根据访问模式创建一个自然主键,那么这就像是锦上添花,因为现在您正在使用一块石头。通过在 where 子句中使用有意义的主键,可以节省额外索引的成本并加快查询速度。

  • 最后但同样重要的是,您将能够节省一个额外的列/键/索引的空间。

于 2020-06-11T18:17:00.107 回答