主キーの設計 (1) 基本的な考え方

最終更新日: 2023年7月10日

何を主キーとするか

主キー項目は「一意であり、必須であり、最初に決めた値から変更されることがない」ことが(アプリケーション全体で)保証されます。

主キーは次のような指針で設計されます。

サロゲートキー (代理キー)

Wagbyの標準設定です。主キー項目を "ID" とし、業務上は意味のない値(順序)を割り当てていきます。主キーの3つの性質「必須」「重複しない」「変更できない」を満たします。

自然キー

主キー項目の名前と型を適切に設定します。業務上、この値が「必須」「重複しない」「(一度決めたあとは)変更できない」という特性を満たすとき、この項目を主キーとして利用できます。例えば商品モデルにおける商品コードや、顧客モデルにおける顧客コードなどが考えられます。

複合キー

複数の項目の組み合わせによって主キーの性質「必須」「重複しない」「変更できない」を満たす場合に設定できます。Wagbyでは複数の項目に「主キーとして利用する」を有効にすることができます。これによって複合キーを実現します。複合キーの詳細は次ページで説明します。

複合キーの設定

それぞれの特徴は次のとおりです。

方針 メリット デメリット
単一&サロゲートキー シンプルで開発しやすい。 モデル同士の関係性がわかりにくい。モデルの数が増えると、IDだけで目的のデータを取得することが複雑になる。
単一&自然キー モデル同士の関係性がキーから把握できる。主キーの値から目的のデータを取得しやすい。 主キーの設計は慎重に行う必要がある。業務上、重複しないと想定していたデータに重複(または値が未設定)が見つかった場合、主キーとして利用できなくなる。運用後に主キーを変えることが難しい。
複合&自然キー 単一キーと複合キーの組み合わせにより、より自然にモデルの関係性を表現できる。

コラム「主キーについて」

Wagbyは単一主キーも複合主キーも扱えます。主キーについてさらに詳しく知りたい方は、コラム > 【Wagbyのこだわり】主キーの扱いをお読みください。

サロゲートキー中心設計の可否

サロゲートキーを利用するが、自然キーのメリットも活かすため、別の項目に主キーの意味を持たせるという設計手法があります。

具体的には(主キーとはしないが)主キーの性質をもった項目を「必須」かつ「一意制約をチェックする」とします。
さらに「入力制御>読み込み専用>更新画面」を設定すると、アプリケーションの更新画面に限って、更新不可とすることができます。

これらの設定の組み合わせでで、その項目を意味的に主キーと同等とすることができます。さらに複数の項目の組み合わせに対して一意制約を設定すると、複合キーと同等になります。

問題点

自然キー(およびその組み合わせによる複合キー)は、データベースが主キーの値を保証します。具体的には、データベースに存在する値は「未設定なし」「重複なし」「更新されない」が守られるため、この点でのデータ異状はありえない、と考えてよいです。

サロゲートキーを使う場合、主キー相当の項目に対して必須指定かつ一意制約指定を行うことで「未設定なし」「重複なし」は保証されますが、「(一度設定された値が)更新されない」はデータベースでは保証されません。例えばスクリプトで直接、値を書き換えることができます。この場合、当該データを参照している側が何らかの影響を受ける可能性があります。アプリケーション開発はこのような異状にならないよう気を付けることが求められます。

つまり主キー値の異状はありえないことをデータベースの責務とするか、アプリケーション開発者がプログラムによって担保するか、が違います。運用・保守の観点からは、データベースの責務とすることが安心です。