#※この記事は書きかけです。まだ完成していません。
#Abstract
この記事での主張は、以下の3点である:
1、リレーショナル型(関係型)データベースとは、思い切っていえば、どんなデータ構造でも作れる万能装置である。
2、つまり、階層型・ネットワーク型のデータ構造も、リレーショナル型データ構造を使って作れる
3、実際に階層型、ネットワーク型のデータ構造を、リレーショナル型データ構造を使って設計する方法
具体的な方法のみを知りたい方は、次の見出しは飛ばし、3を参照されたし。
#1、2、
初心者向けのデータベースの説明として、以下のものがある:
データベースのデータ構造のタイプには、主に、階層型、ネットワーク型、リレーショナル型、の三種がある。
→大雑把にいって、階層型はツリー構造、ネットワーク型はクモの巣型、そしてリレーショナル型は表のような形式である。
→現在使われているデータベースのほとんどは、リレーショナル型を採用しており、階層型、ネットワーク型は前時代の産物である。
この使い古された説明からは、
「現代社会のほとんどのシステムはリレーショナル型が採用されている」
「MySQLなど"一般的"なDBMSは基本的にリレーショナル型である」
ということは読み取れる。
しかし、リレーショナル型はその抽象度故、いったい何ができるのか、俄かにはわかりにくい。
よく使われる概念図をみると、
階層型はツリー構造、ネットワーク型はクモの巣構造、と想像は付きやすいが、
リレーショナル型は、
「表形式のようなもの?」「何がどうリレーショナル(関係)なのか?」「Excelに毛が生えたようなもの?」「いったい何ができるのか」
という程度の理解にとどまってしまう諸君も少なくないのではなかろうか?
リレーショナル型は、概念図と少しの説明では、その全容どころか概要すら把握するのが困難である。
リレーショナル型データ構造とは、データ構造というよりも、
集合論・論理学における『関係』という概念を用いて作られたデータ論理体系
といえる。
現代数学的な見地から生み出された抽象的な概念なので、説明や概念図をパッとみただけではそのシステムの全様を理解するのは難しいが、その抽象性の高さは汎用性の高さをもたらしてくれる。
思い切っていうならば、
リレーショナル型データ構造とは、考え次第でどんなデータ構造でも再現可能な万能装置
といっても言い過ぎではない。
そして、私がこの記事で最も強調したいのは、以下のことである:
階層型・ネットワーク型のデータ構造は、リレーショナル型データ構造を使って(比較的簡単に)再現できる
#3
具体的な方法は以下のとおりである:
###階層型の再現(書きかけ)
ポイントは、
・『ひとつのツリー』に『ひとつのデータベース』を、『ひとつの階層』に『ひとつのテーブル』を対応させる。
・階層間の親子関係を定義する
例えばデータベース「山田家~我が家の家系図~」をつくることを考えよう。
ここでは「親を二つ以上もてない」という階層型データ構造の定義に忠実に従って、
あえて以下のような不自然な仮定を置くことにする:
「山田一族は無性生殖のみを行う(つまり、一人の親から子が生まれる)」
すると、流れとしては以下のようになる:
①テーブル「ルート」をつくり、カラム「名前」を作成し、そこに「山田太郎」を登録する。これが家系図のルートディレクトリとなる。
②テーブル「山田太郎C」を作る。CはChildrenの頭文字である。カラム「名前」を作成し、そこに山田太郎の子供たちの名前を登録する。「山田隼人」「山田龍」「山田梨花」とする。
③テーブル「山田隼人C」「山田龍C」「山田梨花C」をつくり、それぞれにカラム「名前」を作成し、それぞれの子供たちの名前を登録する。
④以下、全ての人物を記入し終えるまで、同様に繰り返す。
⑤子供を持たない人物(家系図が途切れている部分に相当)の数を数える。その数をnとすると、各人物にn個の値1,2,...,nを割り当てる。そしてn個のテーブル「グループ1」「グループ2」…「グループn」を作り、そこに対応する数値の人物を登録する。
⑥
###親を二つ以上もつ階層型
ここで、リレーショナル型の威力の一つを垣間見ることができる。
上の流れを少し変えると、「親を一つまでしか持てない」という階層型データ構造の基本制約を外し、より幅をもった階層型データ構造を作ることができる。
これで、「山田一族は無性生殖のみを行う」という不自然な仮定を取り払うことができる:
①テーブル「ルート」を作る。カラム「名前」を作成し、そこに「山田太郎」「藤田恵美」を登録する。これが家系図のルートディレクトリとなる。
②テーブル「山田太郎×藤田恵美」を作り、カラム「名前」を作成し、そこに子供たちの名前「山田隼人」「山田龍」「山田梨花」および、それぞれの配偶者(義理の子供たち)の名前「西木野真姫」「ヘレン・ケラー」「唐澤貴洋」を登録する。
③テーブル「山田隼人×西木野真姫」「山田龍×ヘレン・ケラー」「山田梨花×唐澤貴洋」を作り、カラム「名前」を作成し、そこに子供たちの名前、およびそれぞれの配偶者(義理の子供たち)の名前を登録する。
以下同様に繰り返せば、まっとうな家系図が出来上がる。
#ネットワーク型の再現