主キーの設計 (1) 基本的な考え方
最終更新日: 2022年10月24日
主キーの項目は「一意であり、必須であり、最初に決めた値から変更されることがない」ことが(アプリケーション全体で)保証されます。
この主キーは次のような指針で設計されます。
Wagbyの標準設定です。主キー項目を "ID" とし、業務上は意味のない値(順序)を割り当てていきます。主キーの3つの性質「必須」「重複しない」「変更できない」を満たします。
主キー項目の名前と型を適切に設定します。業務上、この値は「必須」「重複しない」「変更できない」という特性が必要な項目は主キーとして利用できます。例えば商品モデルにおける商品コードや、顧客モデルにおける顧客コードなどが考えられます。
複数の項目の組み合わせによって主キーの性質「必須」「重複しない」「変更できない」を満たす場合に設定できます。Wagbyでは複数の項目に「主キーとして利用する」を有効にすることができます。これによって複合キーを実現します。複合キーの詳細は次ページで説明します。
それぞれの特徴は次のとおりです。
Wagbyは単一主キーも複合主キーも扱えます。主キーについてさらに詳しく知りたい方は、コラム > 【Wagbyのこだわり】主キーの扱いをお読みください。
サロゲートキーの利用を前提に、自然キーのメリットも活かすため、別の項目に主キーの意味を持たせるという設計手法があります。
サロゲートキーではないが、主キーに相当する項目を「必須」かつ「一意制約をチェックする」とします。
これらの設定の組み合わせでで、その項目を意味的に主キーと同等とすることができます。さらに複数の項目の組み合わせに対して一意制約を設定すると、複合キーと同等になります。
自然キー(およびその組み合わせによる複合キー)は、データベースが主キーの値を保証します。具体的には、データベースに存在する値は「未設定なし」「重複なし」「更新されない」が守られるため、この点でのデータ異状はありえない、と考えてよいです。
サロゲートキーを使う場合、主キー相当の項目に対して必須指定かつ一意制約指定を行うことで「未設定なし」「重複なし」は保証されますが、「(一度設定された値が)更新されない」はデータベースでは保証されません。例えばスクリプトで直接、値を書き換えることができます。この場合、当該データを参照している側が何らかの影響を受ける可能性があります。アプリケーション開発はこのような異状にならないよう気を付けるようにしてください。
次の設計は、モデルBはモデルAの主キーを参照しつつ、自身の主キーとした例です。この場合、両者は 1:1 の対応になります。
モデル参照項目を主キーとすることはできません。モデルB設計のポイントは、主キー項目に対応した入力専用項目を用意することです。
モデルAの型が文字列型の場合、モデルBの主キーの型もまた文字列型となります。モデルBの主キーの値は、モデルAの主キーの値と同じになります。
モデルBにおける「モデルA主キー」項目は入力時、隠し項目とします。
モデルBにおける「モデルA主キー入力用」を用意します。これ自体は主キーではありません。入力専用項目なのでデータベース保存も行いません。
この「モデルA主キー入力用」項目は「自モデル内項目へのマッピング」で主キー項目と紐付けます。これによって、この項目への入出力はすべてマッピングされた項目(ここでは「モデルA主キー」)に対する操作に変わります。
この項目は主キー入力用のため、必須項目とします。
モデルAに2件のテストデータを用意しました。
モデルBの新規登録画面を開きます。「モデルA主キー入力用」項目は必須項目です。
モデルAのデータを選択します。
「モデルA主キー入力用」項目に指定した主キーの値は、マッピング設定によって自動的に「モデルA主キー」項目に反映されています。今回の設定では、この値がモデルB自身の主キーにもなっています。つまりモデルAとモデルBは1:1の関係となっています。
まとめますと、モデルBの各項目は次のような構成になっています。
主キー項目(「モデルA主キー」)は通常、必須項目になります。ただし今回の設定を行った場合は自動的に必須入力チェックは解除されます。その代わり「モデルA主キー入力用」項目を必須としてください。
「モデルA主キー入力用」項目で検索したい場合、必ずこの項目と紐づく主キー「モデルA主キー」も検索条件としてください。
「モデルA主キー入力用」項目はデータベースに保存しません。検索条件として入力した値は「モデルA主キー」に転記されます。実際の検索はこれらの項目に対して行われます。
主キー項目は検索条件画面で隠し項目とします。また条件式を「等しい」とします。
何を主キーとするか
サロゲートキー (代理キー)
自然キー
複合キー
方針
メリット
デメリット
単一&サロゲートキー
シンプルで開発しやすい。
モデル同士の関係性がわかりにくい。モデルの数が増えると、IDだけで目的のデータを取得することが複雑になる。
単一&自然キー
モデル同士の関係性がキーから把握できる。主キーの値から目的のデータを取得しやすい。
主キーの設計は慎重に行う必要がある。業務上、重複しないと想定していたデータに重複(または値が未設定)が見つかった場合、主キーとして利用できなくなる。運用後に主キーを変えることが難しい。
複合&自然キー
単一キーと複合キーの組み合わせにより、より自然にモデルの関係性を表現できる。
コラム「主キーについて」
サロゲートキー中心設計の可否
さらに「入力制御>読み込み専用>更新画面」を設定すると、アプリケーションの更新画面に限って、更新不可とすることができます。
問題点
主キーにモデル参照項目を含める
設計方法
動作の確認
項目 主キー 入力時隠し 必須 備考
モデルA主キー ○ ○
モデルA主キー入力用 ○ 入力値は「モデルA主キー」にマッピングされている。
必須の扱い
検索項目の扱い