読者です 読者をやめる 読者になる 読者になる

リレーショナルデータベースと存在論

社内の Qiita::Team に投稿したポエムなんだけど、公開して欲しいという声もあったし、別に公開して問題のあるところはないので公開することにした。


長らくデータベースの主流として使われてきたリレーショナルデータベース(RDB)のスキーマ設計は、事象の存在と向き合うことである。そういう意味ではとても深遠で哲学的な営みだ。

f:id:a_suenami:20150131160443j:plain

いや、待って欲しい。僕の頭はおかしくない。ちょっと説明する。

データベースの用語と存在論の用語は近い

例えば RDB のテーブルのことを「エンティティ」と呼んだりする。存在論において「実体」を表す用語だ。

カラムのことを「アトリビュート」と呼んだりする。これは存在論においてエンティティの「属性」を表す用語である。

このように用語だけとってもみても RDB と存在論が近い関係にあることがわかる。

「人間」の主キーは一体何か

以前、おもしろい議論をしたことがある。

「人間の主キーは一体何か?」

住民台帳にユニークな番号があるでしょ?と思ったあなた。海外在住の人はどうなりますか?生まれたばかりでまだ出生届けを出していない赤ん坊はどうなりますか?

適当に連番振ればいいじゃんと思ったあなた。Rails に慣れすぎです。わからなくはないんですが今議論したいのはそういうことじゃないです。とりあえずSQLアンチパターン3章「IDリクワイアド(とりあえずID)」を読むことをオススメします。

DNAの情報を記号化できればユニークだと思ったあなた。惜しいですね。一卵性双生児はDNAが同じです。

指紋なら完全にユニークだろ!と思ったあなた。例えば事故にあって腕から先を失くしたした人や指先を酷使して指紋がすり減ってしまった人は人間と認められませんか?

ある事象の存在をどのように特定するのかというのはとても難しい問題で、僕らが普段身近に接している「人間」という存在だってこれだけいろいろ考えて、それでもこれだというユニークなキーは見つからない。だから普通は世界を絞り込むために制約を設ける(例えば日本人に限るとか、役所への届け出をもって存在してるものとするとか)し、もっと設計をシンプルにするためにサロゲートキー(代理キー)、つまり Rails で実装されているような連番の id を使ったりする。

リレーショナルデータモデル

RDB の背後にあるのはリレーショナルデータモデルというデータモデルで、数学的に言うと関係代数と一階述語論理をベースにしている。

リレーショナルデータモデルにおける「リレーション」をテーブルとテーブルの関係だと思っている人はよくいるがこれは誤りで、リレーションは属性(つまりカラム)の関係のことを指す言葉で、平たく言うとテーブルやビューのことである。それは数学的に言うと「ある時点においてある命題が真となる事実の集合」を表すのだけど、そのときに「存在が確実じゃないものは存在しないものとして扱う」という前提がある。これを閉世界仮説という。

要するに何が言いたいかというと RDB はその成り立ちというか背後にある数学的理論からして「ある事象の集合」を扱うものであって、それ以上でもそれ以下でもない。そしてそれらの事象をどのように表現するかとか、どのようにモデリングするかということを考察するうえで存在論の話が出てくるのもおかしな話ではないし、本質的に「存在」を扱うデータモデルなのである。

お詫び

なんかもうちょっと伝えたいことがあった気がするんだけど全然わけのわからない文章になった。今では反省している。