IDとは
あるものを一意に特定するもの。
集合論において、あるものと属性が1:1で対応することを全単射と呼ぶ。
全単射になっているものはIDとして機能とする。
IDを考えるときは、単数に対するものか、複数(グループ)に対するものか、複数であればどのような粒度であるのか?などを考慮する必要がある。ex. カニという属性を考えるとして、どんな種類なのか?何科目なのか?色は?名称は?
一見一意性を持たないような属性であっても、文脈によってはIDとして機能することもある。ex. . 特定の集団におけるその集団が1つしか持ち合わせいない物品など
IDの一部に意味を持たせるような設計は避けたほうが良い。ex. 製品番号の値の一部に色などの識別子を含める
そのような設計をすると第一正規形を満たせなくなるため、クエリが不用意に複雑化したり、DB設計に悪影響を及ぼす。
ナチュラルキーか、サロゲートキーか
ナチュラルキーは実世界に存在する言葉やラベルをIDとするのに対して、サローゲートキーはDBまたはそれを利用するアプリケーション内部だけで通じるものをIDとする。
全単射が成り立つのであればナチュラルキーを使用して問題ないが、次の点に注意を払う。
- IDのライフサイクル
- 一意であっても全単射ではないもの(ex. emailは一意性があっても人と1:1の関係性ではない)
サロゲートキーは次の点に注意を払う。
- ナチュラルキーが存在していないか?
- 存在している場合は無駄なオーバーヘッド(サロゲートキーがあっても ナチュラルキーにユニーク制約が必要となるためインデックス更新の無駄が発生する)を避けるためにナチュラルキーを使う
- 不用意にサロゲートキーを追加すると、サロゲートキーと別の属性の間で関数従属性(Aが決まればBが決まるという性質)が生じ、DB設計が複雑化する
余談
サロゲートキーでID設計する際、物理設計を意識するケースがあると思う。自動採番の値とすべきか、乱択なユニークな値とすべきかによって性能影響があるケースなど。