3 層の情報を取得します。
レイヤー 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 が説明しているように、上記の 2 つのテーブルをなくしID
て、Surname と FirstName を Natural Primary Key として使用することもできます。varchar
この場合、ではなく参照の下のレイヤーを想定しますint
。
レイヤー 2: 人
このレイヤーでは、複合インデックスが使用されます。この値は、代理キーが主キーとして使用されているかどうかに応じて、UNIQUE
またはになります。PRIMARY
+-----------------+--------------+
| FirstName | LastName |
+-----------------+--------------+
| 1 | 2 |
| 1 | 3 |
| 2 | 3 |
| 3 | 1 |
| 4 | 2 |
| ... | ... |
+-----------------+--------------+
レイヤー 3: 親
この層では、人々の間の関係がParentsOf
テーブルを通して調査されます。
ParentsOf
+-----------------+-----------------+
| Person | PersonParent |
+-----------------+-----------------+
OR
+-----------------+-----------------+-----------------+-----------------+
| PersonFirstName | PersonSurname | ParentFirstName | ParentSurname |
+-----------------+-----------------+-----------------+-----------------+
質問
参照整合性が私にとって非常に重要であると仮定すると、FOREIGN KEYS
これらのインデックスを使用して、データベースがこの面での整合性を監視する責任を負うようにし、ORM を使用する場合は、複合主キーをネイティブにサポートするDoctrineのようなものです...
理解するのを手伝ってください:
第 1 層で代理キーと自然キーを使用する場合に生じるトレードオフのリスト。
第 3 層に転送できる第 2 層の複合キーと代理キーを使用する場合のトレードオフのリスト。
このトピックに関して専門家の間で大きな意見の相違があり、それが宗教戦争を引き起こす可能性があることを理解しているため、どちらが優れているかを聞くことに興味はありません. 代わりに、非常に単純かつ客観的に、人間が可能な限り客観的に、代理キーを各レイヤーに渡すことと、主キー (自然/複合、または代理/複合) を維持することによって、どのようなトレードオフを行うかを尋ねています。SOや他のWebサイトで代理キーを絶対に使用しない、または常に使用すると言っている人を誰でも見つけることができます。代わりに、トレードオフの合理的な分析が、あなたの回答で最も高く評価されます。
編集:姓の例は 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 |
+-----------------+-----------------+-----------------+-----------------+
繰り返しますが、これも単なる例です。これは私が進めることをお勧めする方法ではありませんが、私の質問を説明するのに役立つはずです.
この方法には欠点があります。繰り返しますが、この質問は、以下の各方法の利点と欠点を説明するためのものであり、いずれかが優れていると強調するためのものではありません. ほとんどの人は、この特定の例の疑わしい性質を無視して、核となる質問に答えることができたと思います。この編集はできない人のためのものです。
以下に非常に優れた回答がいくつかあります。どの方向に進むべきか興味がある場合は、それらを読んでください。
編集終了
ありがとうございました!