リレーション

データベース、とりわけリレーショナルデータベースの強みは複数のテーブルに対するデータの取得( SELECT )です。 SELECT 時にテーブル同士の関係を付加することで、複数テーブルにまたがるデータを SQL ひとつで取り出すことが可能です。このテーブル同士の関係をリレーションと呼びます。

以下は代表的なリレーションの例です。

Has one.

テーブルAにあるレコードが、テーブルBのレコードのどれかひとつに対応している状態です。

たとえば社員テーブルのレコード(社員)と年金テーブルのレコード(年金加入年)が年金番号で対応している関係です。

社員テーブル
emp_id name division pension
1 太郎 200 12345714
2 次郎 100 13533678
3 三郎 200 65432345
4 四郎 100 52345554
    
社員テーブル
pension joined
12345714 2000
13533678 1982
65432345 1978
52345554 2001
結合後のイメージ
id name pension joined
1 太郎 12345714 2000
2 次郎 13533678 1982
3 三郎 65432345 1978
4 四郎 52345554 2001

Belongs to.

テーブルAにあるレコードが、テーブルBのレコードに属している状態です。

たとえば部署テーブルのレコード(部署)に社員テーブルのレコード(社員)が属している状態です。

部署テーブル
div_id name
100 営業部
200 総務部
300 法務部
400 財務部
    
社員テーブル
emp_id name division pension
1 太郎 200 12345714
2 次郎 100 13533678
3 三郎 200 65432345
4 四郎 100 52345554
結合後のイメージ
div_id name emp_id name division pension
100 営業部 2 次郎 100 13533678
100 営業部 4 四郎 100 52345554
200 総務部 1 太郎 200 12345714
200 総務部 3 三郎 200 65432345

Has many.

テーブルAのあるレコードがテーブルBのレコードを複数所持している状態です。

たとえば社員テーブルのレコード(社員)が定期券テーブルのレコード(定期券)複数所持している関係です。

社員テーブル
emp_id name division pension
1 太郎 200 12345714
2 次郎 100 13533678
3 三郎 200 65432345
4 四郎 100 52345554
    
定期券テーブル
tk_id emp_id take off charge
2400 1 神保原 上野 14500
2401 1 上野 品川 4000
2402 4 横浜 渋谷 8900
2403 3 中野 高円寺 4000
結合後のイメージ
emp_id name tk_id emp_id take off charge
1 太郎 2400 1 神保原 上野 14500
1 太郎 2401 1 上野 品川 4000
4 四郎 2402 4 横浜 渋谷 8900
3 三郎 2403 3 中野 高円寺 4000

Has many and belongs to many.

テーブルAのレコードとテーブルBのレコードが複数個と複数個で結合している状態です。

たとえば社員テーブルのレコード(社員)が会議室テーブル(会議室)を予約した記録などの関係です。

社員テーブル
emp_id name division pension
1 太郎 200 12345714
2 次郎 100 13533678
3 三郎 200 65432345
4 四郎 100 52345554
    
会議室テーブル
mtg_id name
10 大会議室
11 第1会議室
12 第2会議室
13 ミーティングスペース
会議室利用記録テーブル
emp_id name mtg_id name start end
3 三郎 13 ミーティングスペース 10:00 12:00
3 三郎 11 第1会議室 13:00 15:00
1 太郎 12 第2会議室 20:00 21:00
4 四郎 13 ミーティングスペース 9:30 10:00

« 「テーブル内にあるデータのやりとり」へ  |  トップへ  |  上の階層へ

トップページへ戻る / 前のページへ戻る

back to top