受注情報のテーブル設計を生成AIに問い合わせると、たいてい図1の[1][2]のような答が返ってくる。ネットで調べてもそのような事例が数多く見つかるので、AIもそのように答えるのだろう。私は[1][2]ではなく、[3][4]のようにすべきだと常々主張している。その理由を説明しよう。

両者の違いは受注明細の主キーにある。[2]では{受注明細ID}が主キーだが、[4]では{受注№、明細行番}が主キーになっている。Aに対する外部キーがただの属性項目なので[2]は参照関係、主キーの一部に含まれているので[4]は親子関係である。
受注見出しの主キーを{受注id}とするか{受注№}とするかは些末な違いなので、記号に置き換えて一般化した図2の形で両者の違いを検討しよう。図1の[2]と[4]が、それぞれ図2のM[2]とA別〇〇明細[3]に対応している。図2では新たにA・G[4]のパターンが追加されている。

主キーの違いによって、A[1]に対してMは参照関係であるいっぽう、A別〇〇明細、およびA・Gでは親子関係になっている。Aのレコード1件に対して複数件のレコードが対応する点、すなわち「多重度」としては3パターンとも同様なので、これらを「多重度Nエンティティ」と呼んでおく。「多重度1:N」としてはそっくりではあるが、トポロジカルな位置づけは異なっている。
多重度Nエンティティは、これら3パターン以外は原理的に現れないので、ぜひその違いを理解してほしい。まずMにおけるデータ項目aはただの属性なので、更新(訂正)される可能性がある。Mレコード上のaの値が変化することで、それまでと異なるAレコードが参照先として切り替わることになる。具体的には、受注見出しと得意先との関係、あるいは受注明細と品目との関係に相当する。オーソドックスな参照関係だ。
2つ目のパターン:A別〇〇明細は、特定のAレコードが指し示す現実の概念において、その内部で生じる同型反復なオカレンスを表している。主キーに含まれる行番は、あくまでもAの特定インスタンスの内部で生じるオカレンスに対して情報管理上与えられる「序数」であって、Aから独立した定義域を伴わない。冒頭に挙げた受注見出しと受注明細は、本来この関係にある。
いわゆる「第1正規形」のルールである「繰り返し構造の縦持ち」を思い出してほしい。受注明細の元々のイメージは、受注見出し内でn回分の明細情報の繰り返し構造が横持ちされている形だ。これを{受注№、行番}を主キーにしたテーブルで縦持ちにしたものが受注明細である。12回分の月別の繰り返し構造として横持ちされる場合には、年月を意味する序数が複合主キーに含まれる形となる。これも行番の一種だ。
3つ目のパターン:A・Gは、AとGのそれぞれの主キーに対応する独立した定義域の直積の一部が定義域制約を成すことを示している。「定義域の直積」とは、aの定義域がa1,a2で、gの定義域がg1,g2の場合、それらのすべての組み合わせ(a1,g1),(a1,g2),(a2,g1),(a2,g2)のことをいう。たとえば品目と倉庫の組み合わせ「倉庫別品目残高」の主キーは{品目コード、倉庫コード}となる(注1)。
これらの違いを模式化すると図3のようになる。(1)MはAのインスタンスのいずれかを参照する形で出現する。(2)A別〇〇明細は、Aの定義域の内部で各インスタンスが「内訳を孕(はら)む」ような形で順序にしたがって出現する。(3)A・GはAとGの定義域の直積への定義域制約と関数従属性として出現する。多重度Nエンティティには、これだけの精妙かつ決定的な違いがある。3つのパターンにはそれぞれ文脈に応じた必然性があるということで、システム設計者はこれらの違いに精通して、適切なデータ構造を選ばねばならない。

ところが、単独主キーを機械的に付与して参照元テーブルとするやり方(単独主キー主義)では、3つのパターンのどれに相当するデータ構造であるかが、自分にもレビュワーにもわからない。一見するとすべてがMのように見える点も危うい。結果的に、「多重度1:N」にかかわるデータ要件に対する解像度が低下する。これは単独主キー主義がもたらす深刻な弊害である。
複合主キー、そして、前回記事で説明した動的参照関係を適宜盛り込むことで、データモデルは俄然豊かになる。データモデルが豊かになれば、より多くのシステム要件をDB構造として表現できるようになる。結果的に、書くべきロジックの量が減る。デスマーチも残業も減り、生まれた余力で業務知識も学べるのでキャリアの選択肢も広がる。参考にしてほしい。
注1.{品目コード、倉庫コード}と書くと、単独主キー主義者から「自然キーはあてにならない」と反論されることがある。それが面倒なので、品目と倉庫のそれぞれに付与された人工キーの複合主キー{item_id、warehouse_id}としてもいい。これは人工キーの組み合わせなので自然キーではないのだが、かれらは「複合主キーは自然キーだからダメ」と言い出すので意味がわからない。