SQL和关系模型都不会受到引用自然键的外键的干扰。实际上,引用自然键通常会大大提高性能。您会惊讶于您所需的信息被完全包含在自然键中的频率。引用该键可将联接换成更宽的表(因此减少了可在一页中存储的行数)。
根据定义,您所需的信息始终完全包含在每个“查找”表的自然键中。(术语查询表是非正式的。在关系模型中,所有表都只是表。美国邮政编码表中的行可能看起来像这样:{AK,阿拉斯加},{AL,阿拉巴马州},{AZ,亚利桑那州} ,等等。大多数人会称其为查找表。)
在大型系统上,查找具有多个候选键的表并不少见。服务于企业的一部分的表引用一个候选键,而服务于企业的另一部分的表引用不同的候选键也很常见。这是关系模型的优势之一,并且是SQL很好地支持的关系模型的一部分。
当您在还具有代理键的表中引用自然键时,将遇到两个问题。
首先,您会让人们感到惊讶。尽管我通常会强烈建议“最不惊奇原则”,但是在这种情况下,我并不介意让人感到惊讶。当问题是开发人员对外键的逻辑使用感到惊讶时,解决方案是教育而不是重新设计。
其次,ORM通常不是围绕关系模型设计的,它们有时体现不反映最佳实践的假设。(实际上,它们的设计似乎常常没有数据库专业人员的输入。)在每个表中都需要一个ID号是这些假设之一。另一个假设ORM应用程序“拥有”数据库。(因此,可以免费创建,删除和重命名表和列。)
我曾在一个数据库系统上工作过,该系统在30年中为至少用两种语言编写的数百个应用程序提供数据。该数据库属于企业,而不属于ORM。
引入重大变化的叉子应该是秀场停止者。
我曾经在一家公司工作过,同时使用自然键和代理键来衡量性能。有一个临界点,代理键开始超过自然键。(假设没有额外的努力来保持自然键性能很高,例如分区,部分索引,基于函数的索引,额外的表空间,使用固态磁盘等。)根据我对该公司的估计,它们将达到大约2045年。与此同时,使用自然键可以获得更好的性能。
其他相关答案:在数据库架构混乱中