Powered by SmartDoc

リレーショナル・データベース

データベースとデータベース管理システム

データベースとは、データを蓄積したものです。データには、商品の情報や成績・記事のように文字で表現できるものや、画像データなどがあります。

データベースを管理するためのシステムを、データベース管理システム(DataBase Management System = DBMS)と呼びます。

「データベース」と「データベース管理システム」を合わせて「データベース」と呼ぶこともあります。

また、データベースには、データモデルというものがあります。データモデルでは、データベース中のデータがどのように整理されていて、どのようにアクセスできるかを定めています。データモデルには、次のようなものがあります。

現在は「リレーショナルモデル」が最もよく利用されています。

データベース管理システムの役割

データベース管理システムの機能をいくつか挙げてみましょう。

同時アクセスへの対応

データベースに対して、複数のユーザからのアクセスが同時に発生しても、矛盾がおきないよう適切に対応できます。

トランザクション

トランザクションは、データベースにアクセスする一連の処理をひとつにまとめたものです。

例として、銀行の口座Aから口座Bに1万円を振り込む処理について考えてみましょう。次のような手順での処理となるでしょう。

  1. 口座Aから1万円を引く
  2. 口座Bに1万円を足す

こうした処理は一連のもので、「振込」という処理には必要不可欠なものです。例えば、最初の「口座Aから1万円を引く」処理を済ませた直後にデータベースに障害が起き、処理が止まってしまうと、口座からお金が引かれただけで振り込んだことにならなくなってしまいます。

そこで、この1-2の処理をトランザクションにしておきます。そうすることによって、次のようなメリットがあります。

エラー対策が容易になる
トランザクションの途中でデータベースに障害が起き、処理が止まってしまうとします。ここでデータベース管理システムは、それまでの処理を取り消し、なかったことにします。これをロールバック(Rollback)と呼びます。ロールバックは自動的に行われます。
同時実行制御が可能になる
複数の利用者が、同時に同じデータにアクセスするとします。それぞれのトランザクションで利用しているデータは、ロックという仕組みにより、他のトランザクションからアクセスできなくなります。このため、データベースに同時にアクセスされても、データに矛盾が生じなくなります。

高速なアクセス

データベース管理システムでは、管理するデータの量が増えても、高速にデータにアクセスできます。

データの整合性の維持

データベースに不適切なデータが入らないようにします。例えば、銀行の預金残高のデータには整数だけが格納され、アルファベットが入らないようにできます。

データベースを利用したシステム

データを処理するシステムの場合、データベースを使ってデータを管理するのが便利な場合がほとんどです。

データベース管理システムを使うことによって、先に挙げたようなデータの管理に必要な処理を自動的に行ってくれます。

リレーショナルデータベース

リレーショナルモデル

リレーショナルモデルは、1970年にE.F.Codd氏によって提唱されたデータモデルです。リレーショナルデータベース(Relational Database =関係データベースとも言う)は、リレーショナルモデルに基づくデータベースです。リレーショナルデータベースは、いま最も広く使われているデータベースです。市販のデータベースでは、OracleやMicrosoft SQL Serverが良く使われています。また、オープンソースのPostgreSQLやMySQLも著名です。

リレーショナルデータベース

リレーショナルデータベースでは、データを表のような「テーブル」として管理しています。「テーブル」には、「行」と「列」がありますね。例として、「図書館」を表すデータベースに含まれている、「図書」と「図書のキーワード」を表すテーブルのサンプルを示します。

「図書」を示すテーブル
number title author publisher
42377 伽藍とバザール 山形浩生 訳 光芒社
42872 Java言語で学ぶデザインパターン入門 結城浩 著 ソフトパンク
25955 Javaプログラミング実践講座・アプレット作成編 植田龍男 著 アスキー出版局
「図書のキーワード」を示すテーブル
number keyword
42377 オープンソース
42872 Java
42872 デザインパターン
25955 Java
25955 Javaアプレット

「図書を示すテーブル」では、テーブルの1行分のデータが、1冊の図書のデータに対応します。また、このテーブルにはnumber, title, author, publisherという項目があります。

「図書のキーワードを示すテーブル」も同様の構造を持っています。

まとめると、次のようになります。

正確には、テーブルは数学の集合を表現しており、集合演算でデータの操作を行います。

SQL

リレーショナルデータベースでは、SQLというデータベース問い合わせ言語を用いてテーブルにアクセスします。SQLは規格化されており、どのようなリレーショナルデータベースでも、ほぼ同じSQLが動きます。「ほぼ同じ」と言うのは、データベースごとに若干の「方言」があるからです。

主キー

主キー候補キー

テーブルには、まず重複した行を無くすようにします。重複した行がないということは、1行1行がそれぞれ違っているということです。

テーブルから、特定の1行を取り出すとしましょう。重複した行がないので、すべての項目を指定すれば、ある1行を取り出せます。また、すべての項目を指定しなくても、いくつかの項目を指定するだけで、特定の行を取り出せることもあります。そうした項目の組を、「主キー候補キー」あるいは「候補キー」と呼びます。

主キー

「主キー候補キー」のうち、重要な項目で、nullという値をとらないものを「主キー」と呼びます。nullというのは、項目にデータが入っていない状態のことです。単純な場合には、ある項目が単独で「主キー」となります。また、「主キー」には、内容の重複はありえません。

具体的な例を見てみましょう。

テーブル books に含まれる項目
項目名 意味
ndc 図書の分類番号
tyosya_hyouji 著者表示
id 登録番号
title タイトル
author 著者
publisher 出版社

表A.3[テーブル books に含まれる項目]では、「登録番号」が1冊ずつ違った番号になるなら、「登録番号」が主キーとなります。もし主キーが「タイトル」では、「たまたま同じタイトルである本」がありえます。また、「タイトル」と「著者」と「出版社」の組み合わせを主キーとしても、同じ本が何冊か登録されていることがありえます。ですから、この場合は「登録番号」を主キーとするのが正しいのです。

表A.4[テーブル students に含まれる項目]では、「学籍番号」を主キーにするのが良いでしょう。「姓」と「名」の組み合わせでは、同姓同名の人がいると困ります。

テーブル students に含まれる項目
項目名 意味
number 学籍番号
first_name
last_name

正規化

決められたルール通りにテーブル設計することを「正規化」と言います。正規化によって、適切に分割され、保守しやすいテーブルを作成できます。正規化されたテーブルを「正規形」と言います。

正規化にはさまざまな段階があります。通常は第三正規形くらいまで正規化することで、問題はないはずです。

第一正規形

テーブルの項目には、複数の値を入れることはできません。

例えば、「図書」のテーブルに、複数の「キーワード」を付け加えるとしましょう。表A.5[第一正規化されていないテーブル]のようなスタイルが考えられます。

第一正規化されていないテーブル
number title author publisher keyword
42377 伽藍とバザール 山形浩生 訳 光芒社 オープンソース
42872 Java言語で学ぶデザインパターン入門 結城浩 著 ソフトパンク Java
デザインパターン
25955 Javaプログラミング実践講座 植田龍男 著 アスキー出版局 Java
Javaアプレット

しかし、このテーブルでは1つの項目に複数の値が入っています。こうしたテーブルは、表A.6[第一正規化されたテーブル]のように書き直して、複数の値が入らないようにしなければいけません。

第一正規化されたテーブル
number title author publisher keyword
42377 伽藍とバザール 山形浩生 訳 光芒社 オープンソース
42872 Java言語で学ぶデザインパターン入門 結城浩 著 ソフトパンク Java
42872 Java言語で学ぶデザインパターン入門 結城浩 著 ソフトパンク デザインパターン
25955 Javaプログラミング実践講座 植田龍男 著 アスキー出版局 Java
25955 Javaプログラミング実践講座 植田龍男 著 アスキー出版局 Javaアプレット

書き直した結果、複数の値が入らなくなりました。このように変更されたテーブルを、「第一正規形」と呼びます。第一正規形では、どの項目にも、複数の値が入っていません。

第二正規形

関数従属

第一正規化されたテーブルである表A.6[第一正規化されたテーブル]の主キーは「number」と「keyword」になります。

このとき、「タイトル」「著者」「出版社」といった項目の内容は、主キーの一つである「number」という項目があれば自動的に決まります。もう一つの主キーである「keyword」は無くてもよいのです。

このことを、「タイトル」「著者」「出版社」という項目が「number」に関数従属している、と言います。

第二正規形

主キーが複数あるとき、主キーの一部にだけ関数従属している項目を、別のテーブルに移すことを「第二正規化」と言います。この例では、「タイトル」「著者」「出版社」という項目が「number」に関数従属しています。そこで、「number」「タイトル」「著者」「出版社」からなるテーブルを別に作成するのです。

第二正規化されたテーブルは表A.7[「図書」を表すテーブル]表A.8[「図書のキーワード」を表すテーブル]のようになります。

「図書」を表すテーブル
number title author publisher
42377 伽藍とバザール 山形浩生 訳 光芒社
42872 Java言語で学ぶデザインパターン入門 結城浩 著 ソフトパンク
25955 Javaプログラミング実践講座 植田龍男 著 アスキー出版局
「図書のキーワード」を表すテーブル
number keyword
42377 オープンソース
42872 Java
42872 デザインパターン
25955 Java
25955 Javaアプレット

外部キー

第二正規化された「図書」のテーブル(表A.7[「図書」を表すテーブル])では、numberが主キーになります。このnumberは、「キーワード」のテーブル(表A.8[「図書のキーワード」を表すテーブル])でも登場します。この例では、「42377」というnumberを持つ図書は、「オープンソース」というキーワードを持っていることがわかります。「図書」のテーブルと「キーワード」のテーブルは、numberという項目によって関連付けられているのです。

では、「図書」と「キーワード」の関係について考えてみましょう。例えば、「図書」のテーブルに「伽藍とバザール」という本のデータがないときに、「キーワード」のテーブルに「伽藍とバザール」のキーワードがあったら変ですね。「図書」のデータがないのに、その図書の「キーワード」のデータがある、ということはありえないのです。

逆に言うと、「キーワード」にデータを登録するときには、登録するデータのnumberは「図書」テーブルで既に登録されていなければなりません。

こうしたことを「参照整合性制約」と呼びます。また、この例での「キーワード」テーブルのnumber項目のことを「外部キー」と呼びます。

参照整合性制約が設定されていると、次のような制約があります。

第三正規形

表A.9[第三正規化されていないテーブル]のようなテーブルがあったとします。

第三正規化されていないテーブル
number タイトル 著者 出版社 出版社の所在地
42872 Java言語で学ぶデザインパターン入門 結城浩 著 ソフトパンク 東京

このテーブルでは、「出版社の所在地」が「出版社」に関数従属しています。主キーではないキーに関数従属している項目を、別のテーブルに移すことを「第三正規化」と言います。

第三正規化されたテーブルは表A.10[第三正規化されたテーブル (1)]表A.11[第三正規化されたテーブル (2)]のようになります。

第三正規化されたテーブル (1)
number タイトル 著者 出版社
42872 Java言語で学ぶデザインパターン入門 結城浩 著 ソフトパンク
第三正規化されたテーブル (2)
出版社 出版社の所在地
ソフトパンク 東京

参考文献・URL

UNIXデータベース入門