リレーションに関する世界観です。データベースも参照のこと。
リレーショナルデータベースは、表形式でそれぞれの列と行によってデータを格納し、データごとの属性を参照し、それぞれは小さなテーブルとしてデータベースに蓄積され、そのテーブル同士の関係性によって高度なデータを表現するデータベースです。
データベースとは、ある目的を持って格納されたデータの蓄積であると言えます。
リレーショナルデータベースでは、ひとつのテーブルに全てのデータを詰め込むことは基本的にしません。それぞれの小さなたくさんのテーブルを作って、そのテーブルとテーブルを互いに「リレーション」で関連付けて、より大きなテーブルを作成し、テーブルを参照したり、更新したり、挿入したり、削除したり、あるいは結合させたりして扱うことのできるデータベースです。
リレーショナルデータベースの良い点は、最初から完璧なデータ構造を作らず、小さなテーブルを作って関連付けることができる点です。
たとえば、学生の個人情報と、学生の単位や試験の点数などは、別々のテーブルに格納し、それを互いに関連付けて、その場その場で別の表にして扱うことができます。
たとえば、以下の表(学生テーブル)があったとします。
名前 | 年齢 | 学生番号 |
---|---|---|
村上 | 21 | AAAAAAAA |
吉田 | 20 | BBBBBBBB |
ここで、同じ「学生番号」という列を持つ別の表(学部テーブル)があったとします。
学生番号 | 学部 | 担任 |
---|---|---|
AAAAAAAA | 数学部 | 松坂 |
BBBBBBBB | 医学部 | 松井 |
ここで、学生番号という同じ列を用いて、この2つのテーブルを関連付けることができます。
名前 | 年齢 | 学生番号 (外部キー) | 学生番号 (主キー) | 学部 | 担任 | |
---|---|---|---|---|---|---|
村上 | 21 | AAAAAAAA | → | AAAAAAAA | 数学部 | 松坂 |
吉田 | 20 | BBBBBBBB | → | BBBBBBBB | 医学部 | 松井 |
ここで、学部テーブルにおける学生番号(AAAAAAAAまたはBBBBBBBB)のことを、学部テーブルの「主キー」と呼びます。主キーは「そのテーブルにおいてそれぞれの項目を一意に定めることのできる主となるキー」のことです。この主キーを用いて、テーブルを関連付けました。
また、学生テーブルにおける学生番号のことを、「外部キー」と呼びます。外部キーは、別のテーブルの主キーと結びつけるために用いられる、特別なキーのことです。
また、学生番号キーにおいては、同じ学生番号を同時に持つことは許されません。これを「制約」と呼びます。(このような場合は一意性制約と呼び、他にもさまざまな制約がある。また、一意性制約に加えてNULL値を禁止する制約のことを主キー制約と呼ぶ。)
このような考え方に基づいて、リレーショナルデータベースの操作は行われます。
後日注記:外部キーには「外部キー制約」を適用できます。これは外部キーの追加・更新・削除の時に対応する主キーが存在するかどうかを確認させる機能です。
2024.05.26編集
リレーションについて詳しくは以下の書籍が参考になります。
SELECTとJOINを用いてテーブルの結合を行うことで、複数のテーブルを結合することができる。
内部結合、外部結合、クロス結合がある。内部結合と外部結合は、指定されたキーが一致する場合、二つの行を一つの行として結合する。この時、内部結合では、片方だけにデータが存在する場合、それを含めない(消え去る)。外部結合では、片方だけにデータが存在する場合においても含め、データが存在しない場所にはNULLを入れて結合する。
また、交差結合(クロス結合)は、組み合わせとなる行をすべて生成する。A - A, A - B, B - A, B - Bをすべて作成する。
後日注記:一番よく使われるのは内部結合です。外部結合には、さらにLEFT、RIGHT、FULLの3つがあります(FULLは使えない環境もあります)。逆に、クロス結合はほとんど使われません。
後日注記:分かりやすく言うと、どちらにも含まれるデータだけを抽出するのが内部結合である。列の中で値が一致するデータを全て含めて、新しい表を作る。この時、一致しないデータは無視される。一方、どちらかにしか含まれないデータも一緒に結合し、存在しないデータについてはNULL値でデータを挿入するのが外部結合。外部結合には、左のデータを全て含める左外部結合と、右のデータを全て含める右外部結合がある。
たとえば、以下のような二つのテーブルがあるとする。
id | sei | bid |
---|---|---|
1 | 吉田 | C |
2 | 村上 | B |
3 | 大谷 | E |
4 | 近藤 | F |
bid | name |
---|---|
A | 太郎 |
B | 次郎 |
C | 三郎 |
D | 四郎 |
この時、内部結合をすると以下のようになるだろう。
id | sei | bid | name |
---|---|---|---|
1 | 吉田 | C | 三郎 |
2 | 村上 | B | 次郎 |
また、左外部結合をすると以下のようになる。
id | sei | bid | name |
---|---|---|---|
1 | 吉田 | C | 三郎 |
2 | 村上 | B | 次郎 |
3 | 大谷 | E | NULL |
4 | 近藤 | F | NULL |
右外部結合をすると以下のようになる。
id | sei | bid | name |
---|---|---|---|
NULL | NULL | A | 太郎 |
2 | 村上 | B | 次郎 |
1 | 吉田 | C | 三郎 |
NULL | NULL | D | 四郎 |
2024.05.26編集
内部結合のSQL文は、
SELECT field_name, ... FROM table1 INNER JOIN table2 ON table1.bid = table2.bid;
となります。
そして、左外部結合のSQL文は、
SELECT field_name, ... FROM table1 LEFT OUTER JOIN table2 ON table1.bid = table2.bid;
となるのです。
(3ステップでしっかり学ぶ MySQL入門 (今すぐ使えるかんたんプラス)を参考に執筆・引用しました。)
自分の書いた「ニュース - 2021-04-第五週(2021-05-第一週)」2021/04/29より。
データを表で管理するリレーショナルデータベースと、SQLによるクエリは、親和性が高い。
注目すべき項目や属性の範囲を選択して、その時その時のテーブルを自動で生成することができるため、「検索による自動作成」に向いている。
逆に、さまざまな人間が別々にデータを生成したり関連付けたりするのには、ネットワーク型が向いている。リンクによって外部と内部の区別をなくすことができるからである。
また、ファイルシステムのようなディレクトリ型は、ファイルを統一した規則で整理整頓するのに向いている。ファイルだけではなく、「規則そのものを規則的に作り上げる」ために、ディレクトリ型が使えるのである。