📌

データモデリングの頻出単語

2022/04/24に公開

TL;DR

意外に知られていないデータモデリングで使われる用語について、最低限押さえておくべき 6 つの単語(スーパーキー、候補キー、プリマリーキー、代理キー、サロゲートキー、ドメイン)について簡単に説明します。

  • 最低限のモデリングの用語を理解できる
  • モデリングを行う設計者との会話がスムーズになる
  • 自分でモデリングできそうな気がしてくる

スーパーキー

テーブルのレコード(行)を一意に特定できる、カラム(列)の全ての組み合わせのことを言います。 レコードを一意に特定できることが条件ですので、『レコードを一意に特定できるカラム + 関数従属しているカラム』の集合もスーパーキーということが重要です。

エンジニア風に数式で表現すると、『候補キー(この後に説明があります)の数を m』『候補キーに関数従属しているカラムの数を n』とした場合、あるテーブルに存在するスーパーキーの数は、

m + m * \sum_{a=1}^n n C_a
個です。

候補キー

テーブルのレコードを一意に特定できる、カラムの最小の組み合わせのことを言います。 スーパーキーとの違いは、関数従属しているカラムを含まないという点にあります。 候補キーの由来は、『プライマリキーの候補になるカラムの組み合わせだから』。えぇ、そのままです。

プライマリーキー(主キー)

みんなが知っているプライマリーキー。 改めて説明するまでもありませんが、あえて言葉で表現すると、『候補キーの中から、通常使用すると決めたもの』がプライマリーキーです。 データモデリングでは、他のテーブルの候補キーと共通なものや、業務的に自然なものをプライマリーキーとして選択することになります。

代理キー、代替えキー

プライマリーキーとして選択されなかった候補キーが代理キーです。 代理キーも候補キーですので、データモデリングでは代理キーのカラムに一意制約を掛けることが多いでしょう。

サロゲートキー(人工キー)

サロゲートキーは、これまでに出てきた〇〇キーとは毛色が異なり、業務からは導出されない候補キーを意図的に追加したものです。 ちなみに、業務的に導出できる候補キーは、サロゲートキーに対してナチュラルキーと言います。

サロゲートキーは、最近の O/R マッパでは利用を推奨されることが多いですが、データモデリングを主戦場とする設計者に理解されず、嫌われることの多い概念です。 最近の O/R マッパは、ドメイン駆動を念頭に置いていることが多く、ドメインオブジェクトの表現とリレーショナルでの表現のインピーダンスミスマッチの解消が大きな役割です。 このため、業務要件によって変化する可能性のある、ナチュラルキーを用いたリレーショナル表現に束縛されないように、サロゲートキーに置き換えるのは比較的自然な考え方です。 そのあたりに理解のない、(DOA などの古い時代の考えが抜けない)設計者からすると、せっかく綺麗にモデリングをしたのに余計なカラムを入れやがって😡、となってしまいます。

一方で、アプリケーション側に問題がある場合も多く、ドメインオブジェクトを抽出せずリレーショナル表現のままに業務処理を行うにも関わらず、サロゲートキーを定義している場合があります。

これは、どちらが正解というものではなく、アーキテクチャ設計で方針が決まるもので、主義・主張で決まるものではありません。無駄に議論が盛り上がらないように気をつけましょう。

ドメイン(定義域)

ドメインという単語が紛らわしいですが、ドメイン駆動とは異なり、カラムの値が取り得る範囲のことを言います。 細かい定義は置いておいて、カラムの『データ型』『桁』『制約』を表したものです。 言い換えるとカラムは、カラム名とドメインの 2 つの要素から構成されます。

ドメインをどの粒度で定義するかは、モデリングをする人の腕の見せ所(能力が問われる部分)です。 大規模システムでは、データディクショナリの中でドメインを定義することが多いため『業務的な意味で完全にドメインを分ける』ことがありますが、小規模なシステムでは『日付』『名前』『郵便番号』ぐらいの単位にする場合もあります。

実際の現場では、DBMS にドメインを定義することは少なく(そもそも定義できない DBMS もある)、論理モデリングにおいてディクショナリを構築する際にドメイン抽出するまでに止めることが多いですが、ドメインの概念が整理されていないシステムは、(たぶん)ゴミだというのは間違いありません。

まとめ

データモデリングの周辺で良く使われる単語について整理しました。 それぞれの単語を聞いたことはあっても、意味を理解せず雰囲気だけで話を合わせているエンジニアは意外と多くいます。 現場によっては、個々の単語の意味を知らなくても問題ないこともありますが、突然単語が出てきたときのために、

スーパーキー \supset \{候補キー \mid プライマリーキー \bigvee 代理キー \bigvee サロゲートキー\}
の関係性は理解しておくことをお勧めします。

Discussion