このブログの更新は Twitterアカウント @m_hiyama で通知されます。
Follow @m_hiyama

メールでのご連絡は hiyama{at}chimaira{dot}org まで。

はじめてのメールはスパムと判定されることがあります。最初は、信頼されているドメインから差し障りのない文面を送っていただけると、スパムと判定されにくいと思います。

参照用 記事

主キー/外部キーなんてドーデモイイ

土曜日の「データベースは圏なんだよ!の会」(hirataraさんのメモ)で、「主キー/外部キーなんてドーデモイイでしょ」的なことを言ったので、「どういう観点ならドーデモヨク見えるのか」を補足しておきます。別な観点からはドーデモヨクナイでしょうが、そういう別な観点を否定するものではありません*1

以下の話は、集合圏に関する練習問題にもなっています。モノ射とプルバックの定義を確認して、集合圏のなかで具体的に考えてみてください。手を動かして具体的に追いかければ、ドーデモヨサが実感できるはずです*2


Cは集合圏の部分圏としまします。したがって、Cの対象は集合で射は写像です。データベースを考える文脈では、Cは有限個の対象からなる小規模なもの(有限表示を持つ圏)です。Cは、Cと同じ“形状”を持つスキーマSのデータベースインスタンス(スナップショット)だと思ってください。

C対象Aごとに対象K(A)を割り当てる対応を考えます。K:|C|→|C| ですが、自己関手であることは要求しません。さらに、Aごとに γA:A→K(A) in C が対応しているとします。次の条件を課します。

  • すべての対象Aに対して、γA:A→K(A) はモノ射である。

Kとγの組 (K, γ) を仮にキー構造と呼びましょう。K(A)は“Aのキー集合”、γAは“Aの主キーカラム”ってことです。「モノ射である」という条件が主キー制約です。C上のキー構造 (K, γ) の例としては、K(A) = A、γA = idA があります。自明な例ですが、どんな圏にもキー構造が存在することが保証されます。

集合圏(集合と全域写像の圏)の代わりに、集合と部分写像の圏を採用すると、Kを関手、γを恒等関手からKへの自然変換とすることができます。対象Uを固定して、K(A) = U とするなら、γAはAの符号化、UはCの万能対象(万能計算機のデータ領域)と考えることができます。興味がある人は確認してみてください。

さて、Cの射 f:A→B が与えられたとき、f':A→K(B) が「fの代理」であるとは、次が成立することだとします。

  1. f':A→K(B) と γB:B→K(B) で作られる余スパン A→K(B)←B のファイバー積P(プルバック図の頂点)が存在する。
  2. ファイバー積の射影(プルバック図の辺)P→A は同型射(可逆射)である。

一番目の条件は、プルバック図がCをはみ出しても(Set内で作れれば)いいとすれば、特に言及する必要はありません。二番目の条件が外部キー制約です*3

スピヴァックの解釈では、テーブル(のインスタンス)とは集合でありカラム(のインスタンス)とは写像です。Cの射 f':A→K(A) は外部キーによる参照カラムであり、γB:B→K(A) はBの主キーカラムです。それらのファイバー積は等値ジョインですね。参照カラムf'が外部キー制約を満たしているなら、ファイバー積(=等値ジョイン)の射影を取れば、もとの写像fを再現できます。

ここで、キー構造 (K, γ) が圏Cの記述として意味があるか? と考えてみてください。ありていに言って、何の意味もありません。なくても困らないし、自明なキー構造以外に標準的なキー構造を選ぶ基準はありません。f:A→B があるとき、fの代理f'は、f;γB として作れます。代理を作る操作は、ホムセットのあいだの写像 (-)':C(A, B)→C(A, K(B)) を誘導します。が、この写像に意義も面白みもありません*4

Cを情報の表現と考えたとき、キー構造は余分で無意味なものです; 自明なキー構造は常に存在するし、それ以外のキー構造の選択は恣意的(根拠なしに選ぶ)になります。f:A→B を、代理 f':A→K(B) で表してみて、それをわざわざファイバー積で元に戻して何がうれしいのでしょうか? 例えば、ある従業員の勤務先電話番号を知るには、「その人の勤務先営業所」「営業所の電話番号」という写像(=カラム)を順次結合(合成)すればいいだけでしょ。

結局、キー構造の必要性はソフトウェアが動くための仕掛けとしてなんです。仕掛けとしては必須で重要ですが、情報のモデリングとしては恣意的で余分な構造です。ユーザー(情報の利用者)から見えている必要はないし、キー構造を取り替えても外部的影響が出ないようにするべきです。キー構造を使った写像の代理はあくまで代理であり本物ではありません。そんなものを主役にしてはいけません

*1:例えば、「ソフトウェアのパフォーマンスを上げたい」という状況ではまったく別な価値判断が生じるでしょう。

*2:ものすごく実感して、ドーデモイイことに拘っていた過去の自分の阿呆さ加減に臍を噛んでいるのは、この僕です。

*3:これは、fの像集合f(A)が、γBの像集合γB(B)に含まれることと同値になります。集合圏におけるモノ射やプルバックの定義を書き下してみれば分かります。ぜひに手を動かして具体的に確認してみてください。

*4:万能対象Uを定めて、それを計算可能性のモデルとして考えたりするのはとても面白いです。しかし、そのテの話はソフトウェアの仕掛け(計算)を興味の対象とする立場です。圏Cを外部世界の情報的モデルとして取り扱う立場とは別です。スピヴァック青年のテーマは計算論ではなくて情報学でしょう。