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

最終更新日: 2022年10月24日

何を主キーとするか

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

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

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

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

自然キー

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

複合キー

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

複合キーの設定

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

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

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

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

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

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

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

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

問題点

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

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

主キーにモデル参照項目を含める

設計方法

次の設計は、モデルBはモデルAの主キーを参照しつつ、自身の主キーとした例です。この場合、両者は 1:1 の対応になります。

モデルAとモデルBの関係
モデルAの設定

モデル参照項目を主キーとすることはできません。モデルB設計のポイントは、主キー項目に対応した入力専用項目を用意することです。

モデルBの設定

モデルAの型が文字列型の場合、モデルBの主キーの型もまた文字列型となります。モデルBの主キーの値は、モデルAの主キーの値と同じになります。

モデルBにおける「モデルA主キー」項目は入力時、隠し項目とします。

モデルA主キーを隠し項目とする

モデルBにおける「モデルA主キー入力用」を用意します。これ自体は主キーではありません。入力専用項目なのでデータベース保存も行いません。

この「モデルA主キー入力用」項目は「自モデル内項目へのマッピング」で主キー項目と紐付けます。これによって、この項目への入出力はすべてマッピングされた項目(ここでは「モデルA主キー」)に対する操作に変わります。

自モデル内項目へのマッピング設定

この項目は主キー入力用のため、必須項目とします。

必須指定

動作の確認

モデルAに2件のテストデータを用意しました。

モデルAに用意したテストデータ

モデルBの新規登録画面を開きます。「モデルA主キー入力用」項目は必須項目です。

モデルB新規登録画面(2)

モデルAのデータを選択します。

モデルB新規登録画面(2)

「モデルA主キー入力用」項目に指定した主キーの値は、マッピング設定によって自動的に「モデルA主キー」項目に反映されています。今回の設定では、この値がモデルB自身の主キーにもなっています。つまりモデルAとモデルBは1:1の関係となっています。

モデルBはモデルAのキーと同じにしたい

まとめますと、モデルBの各項目は次のような構成になっています。

項目主キー入力時隠し必須備考
モデルA主キー
モデルA主キー入力用入力値は「モデルA主キー」にマッピングされている。

必須の扱い

主キー項目(「モデルA主キー」)は通常、必須項目になります。ただし今回の設定を行った場合は自動的に必須入力チェックは解除されます。その代わり「モデルA主キー入力用」項目を必須としてください。

検索項目の扱い

「モデルA主キー入力用」項目で検索したい場合、必ずこの項目と紐づく主キー「モデルA主キー」も検索条件としてください。

「モデルA主キー入力用」項目はデータベースに保存しません。検索条件として入力した値は「モデルA主キー」に転記されます。実際の検索はこれらの項目に対して行われます。

検索条件の設定(1)

主キー項目は検索条件画面で隠し項目とします。また条件式を「等しい」とします。

検索条件の設定(2)