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設計する際、物理設計を意識するケースがあると思う。自動採番の値とすべきか、乱択なユニークな値とすべきかによって性能影響があるケースなど。

    参考


    関連書籍