DB設計におけるID設計について

#DB

IDとは

あるものを一意に特定するもの。

集合論において、あるものと属性が1:1で対応することを全単射と呼ぶ。

全単射になっているものはIDとして機能とする。

IDを考えるときは、単数に対するものか、複数(グループ)に対するものか、複数であればどのような粒度であるのか?などを考慮する必要がある。ex. カニという属性を考えるとして、どんな種類なのか?何科目なのか?色は?名称は?

一見一意性を持たないような属性であっても、文脈によってはIDとして機能することもある。ex. . 特定の集団におけるその集団が1つしか持ち合わせいない物品など

IDの一部に意味を持たせるような設計は避けたほうが良い。ex. 製品番号の値の一部に色などの識別子を含める

そのような設計をすると第一正規形を満たせなくなるため、クエリが不用意に複雑化したり、DB設計に悪影響を及ぼす。

ナチュラルキーか、サロゲートキーか

ナチュラルキーは実世界に存在する言葉やラベルをIDとするのに対して、サローゲートキーはDBまたはそれを利用するアプリケーション内部だけで通じるものをIDとする。

全単射が成り立つのであればナチュラルキーを使用して問題ないが、次の点に注意を払う。

  • IDのライフサイクル
  • 一意であっても全単射ではないもの(ex. emailは一意性があっても人と1:1の関係性ではない)

サロゲートキーは次の点に注意を払う。

  • ナチュラルキーが存在していないか?
    • 存在している場合は無駄なオーバーヘッド(サロゲートキーがあっても ナチュラルキーにユニーク制約が必要となるためインデックス更新の無駄が発生する)を避けるためにナチュラルキーを使う
    • 不用意にサロゲートキーを追加すると、サロゲートキーと別の属性の間で関数従属性(Aが決まればBが決まるという性質)が生じ、DB設計が複雑化する

余談

サロゲートキーでID設計する際、物理設計を意識するケースがあると思う。自動採番の値とすべきか、乱択なユニークな値とすべきかによって性能影響があるケースなど。

参考