"リレーショナルデータベースはすべてのデータを2次元の表形式で表現"こういうのもリレーションが2次元構造という誤解の一種なんだろうか。id:nippondanjiさんが書いてたような。
さて、この疑問に対する正解は如何なるものだろうか?
つい先日「7つのデータベース 7つの世界」の書評で書いたばかりだが・・・
言うまでもなくその通りである。
リレーションが2次元的な構造を持っているというのは典型的な誤解だ。(ちなみにリレーションの次元は属性の数に等しい。n個の属性があるリレーションはn次元。)リレーショナルモデルについてちゃんと学習していれば間違うことはないのだが、この誤解は本当に多い。
問題の記事にはまだ他にも問題があるので、文章を引用して問題点を指摘しておこう。
リレーショナルデータベースはすべてのデータを2次元の表形式で表現し、関係する項目同士にリレーションシップ(関係)を設定することで複雑なデータも表現することができます。カード型やネットワーク型などのデータベースに比べて、人間が直感的に理解しやすいことから急速に普及し、現在ではただ単に「データベース」といった場合には、「リレーショナルデータベース」のことを指すと思って間違いないでしょう。
前半部分の"リレーショナルデータベースはすべてのデータを2次元の表形式で表現し"というのも典型的な誤りだが、後半の"関係する項目同士にリレーションシップ(関係)を設定する"というのもまたポピュラーな誤りである。なんとひとつの文章の中に2つの典型的な誤解が含まれているではないか。
とまあふざけるのはこのへんにして、後半部分について少し説明しよう。SQLでリレーションに相当するものはテーブルだ。テーブルとリレーションには数々の相違点があるのだがここではいったん置いておく。(詳しくはWEB+DB PRESSで連載中の「理論で学ぶSQL再入門」などを見て欲しい。ガッツリ学習するならChris Date氏の著書がオススメだ。連載ではできるだけ平易な言葉を使うよう注意しているので易しい説明が好きな人にはそちらを薦めたい。)重要なのはリレーショナルモデルにおける「関係」ないしは「リレーション」とは、テーブル同士の関係(リレーションシップ)のことではなく、テーブルそのものを指すという点だ。「テーブル同士の関係性を表現するデータモデルだ」というのは非常にポピュラーな誤解である。リレーショナルモデルはリレーション同士の関係性ではなく、リレーション内のアトリビュート(属性)、すなわちSQLでいうところのカラム(列)同士の関係性を表現するデータモデルなのだ。残念なことに、この点についても誤解している人は本当に多い。
ところで、先ほど触れた連載とは別に、最近出たばかりのWEB+DB PRESSの74号の特集で、MySQLの入門について書いた。その際RDBMSの基礎としてリレーショナルモデルについても簡単に説明しているので良ければ参照して頂きたい。(ちなみに、WEB+DB PRESSの記事では、先ほど引用した文章の中にある"人間が直感的に理解しやすいことから急速に普及し"という意見とは正反対のことを書いた。直感的という意味では表計算のほうが分かりやすいよね、的な。)
先ほどの記事はどうやら連載のようだが、連載目次を見ると「テーブル間をどのように関連づけるの?」というタイトルのものが予定されているようだ。くれぐれも「外部キーでリレーションもバッチリだ!」というような過ちを犯すことがないように願っている。
なぜこのように間違ってしまう人が絶えないのだろうか。恐らくは、SQLを学習する際、みな実践ばかりに力を入れて、理論(リレーショナルモデル)についての学習が疎かになっているからではないかと思う。実践は確かに大事だ。実践されない理論は無意味である。だが、理論のない実践もまた危険なのである。ときには実践ばかりではなく、理論についても学習する機会を持ってみてはいかがだろうか。せっかくRDBMSについて学ぶのであれば、どうせなら正しい知識を身につけてもらいたいと思う。最初に誤った知識をして後からそれを修正するという回り道をすることで得られるものもあるかも知れないが、誤った知識を身につけたままでいるというリスクもあるので、やはり最初から正しい知識を身につけるに越したことはないのである。
3 コメント:
> なぜこのように間違ってしまう人が絶えないのだろうか。
> 恐らくは、SQLを学習する際、みな実践ばかりに力を入れて、
> 理論(リレーショナルモデル)についての学習が疎かに
> なっているからではないかと思う。
個人的には、単にDB会社が「二次元のテーブル」と説明しているせいだと思います。
たとえばOracle11gの資料では:
http://otndnld.oracle.co.jp/document/products/oracle11g/111/doc_dvd/server.111/E05759-03/intro.htm#734
> リレーショナル・データベースでは、すべてのデータが、行と列で構成される2次元の表に格納されます。
また別のOracle資料
http://www.oracle.co.jp/corp/hiroshima/club/specially/events/doc/hrs070515-1.pdf
の5ページ目:
> リレーショナル型データベースでは、データを行と列から構成される2次元の表形式で表します。
特に、OLAPでは「テーブルは二次元、キューブは多次元」という説明がよくされてるように思いますが、いかがでしょうか。
たとえばOracle OLAPのリファレンスマニュアルでは
http://otndnld.oracle.co.jp/document/products/oracle11g/111/doc_dvd/olap.111/E05732-02/dml_app_sqlfunc003.htm
> OLAP_TABLEは、アナリティック・ワークスペースから多次元データを抽出し、
> そのデータを2次元のリレーショナル表に表示するSQLファンクションです。
「n個の属性があるから2次元ではなくn次元だ!」という主張は、数学的にはたしかにその通りだと思います。しかしRDBMSのトップベンダーがマニュアルでこういう説明をしてるんですから、他の技術者が「二次元のテーブル」という表現をするのは仕方ないように思いました。
また、「二次元のテーブル」というかわりに「n次元のテーブル」という表現は、なかなか受け入れられないと思います。理由は、説明する人はテーブルにn個の属性があることを表現したいわけではなく、テーブルがタテとヨコ(列と行)から構成されること、つまり平面的であることを表現したいだけだからです。
なので、
『2次元のテーブル』という説明は間違い、正しくは『多次元』だ
と主張するだけでなく、
『2次元のテーブル』という説明は間違いなので、『行と列から成る平面的なテーブル』という説明にしてほしい
という呼びかけをしてみてはいかがでしょうか(もちろんもっといい表現があればそのほうがいいです)。
なお余談ですが、このブログのMySQLの説明は大変参考になります。特にMySQLのサブクエリーが遅い理由の説明は勉強になりました。ありがとうございます。
kwatchさん、コメントありがとうございます。
> 「n個の属性があるから2次元ではなくn次元だ!」という主張は、数学的にはたしかにその通りだと思います。しかしRDBMSのトップベンダーがマニュアルでこういう説明をしてるんですから、他の技術者が「二次元のテーブル」という表現をするのは仕方ないように思いました。
確かにその表現はよくないですね。社内で事情を聞いてみたいと思います。
> テーブルがタテとヨコ(列と行)から構成されること、つまり平面的であることを表現したいだけだからです。
これは結局2次元であるということと同じだと思います。本文ではざっくりと「n次元」と書いてしまいましたが、リレーションの構造はより正確にいうと「n次元の空間上にプロットされた点の集合」という感じのほうが適切ですね。本来は平面上に描画できるものではなく、便宜上「行」と「列」からなる2次元的な構造を持つ表として表現されているだけで、その表現を見て「あ、これは2次元なんだ」と思ってしまうのが問題です。世の中この誤解が蔓延してるわけです。
> なお余談ですが、このブログのMySQLの説明は大変参考になります。
こちらこそ読んで頂いてありがとうございます。
コメントを投稿