データベースとは、データを蓄積したものです。データには、商品の情報や成績・記事のように文字で表現できるものや、画像データなどがあります。
データベースを管理するためのシステムを、データベース管理システム(DataBase Management System = DBMS)と呼びます。
「データベース」と「データベース管理システム」を合わせて「データベース」と呼ぶこともあります。
また、データベースには、データモデルというものがあります。データモデルでは、データベース中のデータがどのように整理されていて、どのようにアクセスできるかを定めています。データモデルには、次のようなものがあります。
現在は「リレーショナルモデル」が最もよく利用されています。
データベース管理システムの機能をいくつか挙げてみましょう。
データベースに対して、複数のユーザからのアクセスが同時に発生しても、矛盾がおきないよう適切に対応できます。
トランザクションは、データベースにアクセスする一連の処理をひとつにまとめたものです。
例として、銀行の口座Aから口座Bに1万円を振り込む処理について考えてみましょう。次のような手順での処理となるでしょう。
こうした処理は一連のもので、「振込」という処理には必要不可欠なものです。例えば、1を済ませた直後にデータベースに障害が起き、処理が止まってしまうと、口座からお金が引かれただけで振り込んだことにならなくなってしまいます。
そこで、この1-2の処理をトランザクションにしておきます。そうすることによって、次のようなメリットがあります。
データベース管理システムでは、管理するデータの量が増えても、高速にデータにアクセスできます。
データベースに不適切なデータが入らないようにします。例えば、銀行の預金残高のデータには整数だけが格納され、アルファベットが入らないようにできます。
データを処理するシステムの場合、データベースを使ってデータを管理するのが良い場合がほとんどです。データベースを使うと、データベース管理システムが「トランザクション」「高速なアクセス」「データの整合性の維持」を自動的に実行してくれるので、便利です。データベース管理システムと同じ処理を自分でプログラミングするのは、面倒な作業です。
リレーショナルモデルは、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が動きます。「ほぼ同じ」と言うのは、データベースごとに若干の「方言」があるからです。
テーブルには、まず重複した行を無くすようにします。重複した行がないということは、1行1行がそれぞれ違っているということです。
テーブルから、特定の1行を取り出すとしましょう。重複した行がないので、すべての項目を指定すれば、ある1行を取り出せます。また、すべての項目を指定しなくても、いくつかの項目を指定するだけで、特定の行を取り出せることもあります。そうした項目の組を、「主キー候補キー」あるいは「候補キー」と呼びます。
「主キー候補キー」のうち、重要な項目で、nullという値をとらないものを「主キー」と呼びます。nullというのは、項目にデータが入っていない状態のことです。単純な場合には、ある項目が単独で「主キー」となります。また、「主キー」には、内容の重複はありえません。
具体的な例を見てみましょう。
項目名 | 意味 |
---|---|
ndc | 図書の分類番号 |
tyosya_hyouji | 著者表示 |
id | 登録番号 |
title | タイトル |
author | 著者 |
publisher | 出版社 |
表[テーブル books に含まれる項目]では、「登録番号」が1冊ずつ違った番号になるなら、「登録番号」が主キーとなります。もし主キーが「タイトル」では、「たまたま同じタイトルである本」がありえます。また、「タイトル」と「著者」と「出版社」の組み合わせを主キーとしても、同じ本が何冊か登録されていることがありえます。ですから、この場合は「登録番号」を主キーとするのが正しいのです。
表[テーブル students に含まれる項目]では、「学籍番号」を主キーにするのが良いでしょう。「姓」と「名」の組み合わせでは、同姓同名の人がいると困ります。
項目名 | 意味 |
---|---|
number | 学籍番号 |
first_name | 姓 |
last_name | 名 |
決められたルール通りにテーブル設計することを「正規化」と言います。正規化によって、適切に分割され、保守しやすいテーブルを作成できます。正規化されたテーブルを「正規形」と言います。
正規化にはさまざまな段階があります。通常は第三正規形くらいまで正規化することで、問題はないはずです。
テーブルの項目には、複数の値を入れることはできません。
例えば、「図書」のテーブルに、複数の「キーワード」を付け加えるとしましょう。表[第一正規化されていないテーブル]のようなスタイルが考えられます。
number | title | author | publisher | keyword |
---|---|---|---|---|
42377 | 伽藍とバザール | 山形浩生 訳 | 光芒社 | オープンソース |
42872 | Java言語で学ぶデザインパターン入門 | 結城浩 著 | ソフトパンク | Java |
デザインパターン | ||||
25955 | Javaプログラミング実践講座 | 植田龍男 著 | アスキー出版局 | Java |
Javaアプレット |
しかし、このテーブルでは1つの項目に複数の値が入っています。こうしたテーブルは、表[第一正規化されたテーブル]のように書き直して、複数の値が入らないようにしなければいけません。
number | title | author | publisher | keyword |
---|---|---|---|---|
42377 | 伽藍とバザール | 山形浩生 訳 | 光芒社 | オープンソース |
42872 | Java言語で学ぶデザインパターン入門 | 結城浩 著 | ソフトパンク | Java |
42872 | Java言語で学ぶデザインパターン入門 | 結城浩 著 | ソフトパンク | デザインパターン |
25955 | Javaプログラミング実践講座 | 植田龍男 著 | アスキー出版局 | Java |
25955 | Javaプログラミング実践講座 | 植田龍男 著 | アスキー出版局 | Javaアプレット |
書き直した結果、複数の値が入らなくなりました。このように変更されたテーブルを、「第一正規形」と呼びます。第一正規形では、どの項目にも、複数の値が入っていません。
第一正規化されたテーブルである表[第一正規化されたテーブル]の主キーは「number」と「keyword」になります。
このとき、「タイトル」「著者」「出版社」といった項目の内容は、主キーの一つである「number」という項目があれば自動的に決まります。もう一つの主キーである「keyword」は無くてもよいのです。
このことを、「タイトル」「著者」「出版社」という項目が「number」に関数従属している、と言います。
主キーが複数あるとき、主キーの一部にだけ関数従属している項目を、別のテーブルに移すことを「第二正規化」と言います。この例では、「タイトル」「著者」「出版社」という項目が「number」に関数従属しています。そこで、「number」「タイトル」「著者」「出版社」からなるテーブルを別に作成するのです。
第二正規化されたテーブルは表[「図書」を表すテーブル]と表[「図書のキーワード」を表すテーブル]のようになります。
number | title | author | publisher |
---|---|---|---|
42377 | 伽藍とバザール | 山形浩生 訳 | 光芒社 |
42872 | Java言語で学ぶデザインパターン入門 | 結城浩 著 | ソフトパンク |
25955 | Javaプログラミング実践講座 | 植田龍男 著 | アスキー出版局 |
number | keyword |
---|---|
42377 | オープンソース |
42872 | Java |
42872 | デザインパターン |
25955 | Java |
25955 | Javaアプレット |
第二正規化された「図書」のテーブル(表[「図書」を表すテーブル])では、numberが主キーになります。このnumberは、「キーワード」のテーブル(表[「図書のキーワード」を表すテーブル])でも登場します。この例では、「42377」というnumberを持つ図書は、「オープンソース」というキーワードを持っていることがわかります。「図書」のテーブルと「キーワード」のテーブルは、numberという項目によって関連付けられているのです。
では、「図書」と「キーワード」の関係について考えてみましょう。例えば、「図書」のテーブルに「伽藍とバザール」という本のデータがないときに、「キーワード」のテーブルに「伽藍とバザール」のキーワードがあったら変ですね。「図書」のデータがないのに、その図書の「キーワード」のデータがある、ということはありえないのです。
つまり、「キーワード」にデータを登録するときには、登録するデータのnumberは「図書」テーブルで既に登録されていなければなりません。このことを「参照整合性制約」と呼びます。また、この例での「キーワード」テーブルのnumber項目のことを「外部キー」と呼びます。
参照整合性制約が設定されていると、次のような制約があります。
表[第三正規化されていないテーブル]のようなテーブルがあったとします。
number | タイトル | 著者 | 出版社 | 出版社の所在地 |
---|---|---|---|---|
42872 | Java言語で学ぶデザインパターン入門 | 結城浩 著 | ソフトパンク | 東京 |
このテーブルでは、「出版社の所在地」が「出版社」に関数従属しています。主キーではないキーに関数従属している項目を、別のテーブルに移すことを「第三正規化」と言います。
第三正規化されたテーブルは表[第三正規化されたテーブル (1)]と表[第三正規化されたテーブル (2)]のようになります。
number | タイトル | 著者 | 出版社 |
---|---|---|---|
42872 | Java言語で学ぶデザインパターン入門 | 結城浩 著 | ソフトパンク |
出版社 | 出版社の所在地 |
---|---|
ソフトパンク | 東京 |