获取三层信息:
第 1 层:信息
该层包含具有UNIQUE
自然索引的数据和易于传输的代理键。
Table Surnames:
+-----------------------------+--------------+
| ID (Auto Increment, PK) | Surname |
+-----------------------------+--------------+
| 1 | Smith |
| 2 | Edwards |
| 3 | Brown |
+-----------------------------+--------------+
Table FirstNames
+-----------------------------+--------------+
| ID (Auto Increment, PK) | FirstName |
+-----------------------------+--------------+
| 1 | John |
| 2 | Bob |
| 3 | Mary |
| 4 | Kate |
+-----------------------------+--------------+
自然键
或者,如 Mike Sherrill 所解释的,上面的两个表可以不ID
使用 Surname 和 FirstName 作为自然主键。在这种情况下,假设下面的层引用varchar
而不是int
.
第 2 层:人
在这一层中,使用了复合索引。此值可以是UNIQUE
或PRIMARY
,具体取决于代理键是否用作主键。
+-----------------+--------------+
| FirstName | LastName |
+-----------------+--------------+
| 1 | 2 |
| 1 | 3 |
| 2 | 3 |
| 3 | 1 |
| 4 | 2 |
| ... | ... |
+-----------------+--------------+
第三层:父母
在这一层中,人们之间的关系是通过一个ParentsOf
表格来探索的。
ParentsOf
+-----------------+-----------------+
| Person | PersonParent |
+-----------------+-----------------+
OR
+-----------------+-----------------+-----------------+-----------------+
| PersonFirstName | PersonSurname | ParentFirstName | ParentSurname |
+-----------------+-----------------+-----------------+-----------------+
问题
假设引用完整性在其核心对我来说非常重要,并且我将拥有FOREIGN KEYS
这些索引,以便我让数据库负责在这方面监控其自身的完整性,并且如果我要使用 ORM,它会像Doctrine一样,它具有对复合主键的本机支持......
请帮助我理解:
在第一层使用代理键与自然键时发生的权衡列表。
在第二层使用复合键与代理键时发生的权衡列表,可以转移到第三层。
我对听哪个更好不感兴趣,因为我知道专业人士在这个话题上存在重大分歧,这将引发一场宗教战争。相反,我非常简单和尽可能客观地问,通过将代理键传递给每个层与维护主键(自然/复合或代理/复合),您将采取哪些权衡。任何人都可以在 SO 和其他网站上找到说从不或总是使用代理键的人。相反,对权衡的合理分析是我在您的回答中最欣赏的。
编辑:有人指出,姓氏示例是使用 6NF 的不良示例。为了保持问题完整,我将保留它。如果您无法想象这个用例,一个更好的可能是“杂货项目”列表。又名:
+-----------------------------+--------------+
| ID (Auto Increment, PK) | Grocery |
+-----------------------------+--------------+
| 1 | Sponges |
| 2 | Tomato Soup |
| 3 | Ice Cream |
| 4 | Lemons |
| 5 | Strawberries |
| 6 | Whipped Cream|
+-----------------------------+--------------+
+-----------------------------+--------------+
| ID (Auto Increment, PK) | Brand |
+-----------------------------+--------------+
| 1 | Bright |
| 2 | Ben & Jerry's|
| 3 | Store Brand |
| 4 | Campbell's |
| 5 | Cool Whip |
+-----------------------------+--------------+
自然复合键示例:
+-----------------------------+--------------+
| Grocery | Brand |
+-----------------------------+--------------+
| Sponges | Bright |
| Ice Cream | Ben & Jerry's|
| Ice Cream | Store Brand |
| Tomato Soup | Campbell's |
| Tomato Soup | Store Brand |
| Lemons | Store Brand |
| Whipped Cream | Cool Whip |
+-----------------------------+--------------+
推荐配对
+-----------------+-----------------+-----------------+-----------------+
| Grocery1 | Brand1 | Grocery2 | Brand2 |
+-----------------+-----------------+-----------------+-----------------+
重申一下,这也只是一个例子。这不是我建议进行的方式,但它应该有助于说明我的问题。
这种方法存在不足之处。我要重申,这个问题是要求了解下面每种方法的优缺点,而不是强调其中一种方法比另一种更好。我相信大多数人都能够通过这个特定示例的可疑性质来回答核心问题。此编辑适用于那些不能。
下面有一些非常好的答案,如果您对前进的方向感到好奇,请阅读它们。
结束编辑
谢谢!