関係データモデル
このノートの問いがそのまま復習カードになり、忘れかけたころに出題されます。
0. どういうまとまりか
いま最も広く使われているデータベースは、データを表の形で持ちます。
表を何枚かに分けて持ち、必要なときに表から行や列を取り出したり、表どうしをつないだりして答えを作ります。
| 操作 | 何を取り出すか | 表の形はどう変わるか |
|---|---|---|
| 選択 | 条件に合う行 | 横に切る(列はそのまま、行が減る) |
| 射影 | 指定した列 | 縦に切る(行はそのまま、列が減る) |
| 結合 | 2 つの表を、共通の列の値でつないだもの | 横につなぐ(列が増える) |
分かれ目は次の 3 つ。
- 選択は行、射影は列。 取り違えやすいので「選択=行を選ぶ、射影=列を映す」と対にして覚える。
- 主キーは「その表の中で行を一つに決める列」、外部キーは「別の表の主キーを指す列」。
- 表を分ける(正規化)のは、同じデータを何度も書かないため。 分けた表は結合で元に戻せる。
1. 関係データモデルと表
根拠: 学習指導要領 情報Ⅰ-(4)-ア-(イ)
データを行と列からなる表で表し、表どうしの関係(共通の列)で結びつけて扱う考え方を関係データモデルといいます。
この考え方でつくったデータベースが、関係データベース(リレーショナルデータベース)です。
| 生徒番号 | 氏名 | 学年 | 部活コード |
|---|---|---|---|
| S01 | 青木 | 1 | B1 |
| S02 | 井上 | 2 | B2 |
| S03 | 上田 | 1 | B2 |
| S04 | 江藤 | 2 | B3 |
| 部活コード | 部活名 |
|---|---|
| B1 | 美術部 |
| B2 | 写真部 |
| B3 | 放送部 |
関係データモデルとは、データをどう表す考え方か?
データを行と列からなる表で表し、表どうしを共通の項目で関連づけて扱う考え方
この考え方でつくったデータベースを、関係データベース(リレーショナルデータベース)という。
関係データベースの表で、横の 1 行(1 件分のデータ)を何というか?
レコード(行)
生徒の表なら、1 人の生徒の生徒番号・氏名・学年などをまとめた 1 行。
関係データベースの表で、縦の 1 列(同じ種類の項目)を何というか?
フィールド(列)
生徒の表の「氏名」「学年」のように、どのレコードにも共通する項目。属性ともいう。
2. 主キーと外部キー
根拠: 学習指導要領 情報Ⅰ-(4)-ア-(イ)
表の中から特定の 1 行を取り出すには、行を区別できる列が要ります。
氏名は同姓同名がありうるので、重ならないように番号を振った列を用意します。
主キーとは何か?
表の中で、レコードを 1 つに特定できる列(または列の組)
生徒の表の「生徒番号」。同じ値が 2 つあってはならず、空欄も許されない。
「氏名」の列が主キーに向かないのはなぜか?
同姓同名の人がいると、値が重複してレコードを 1 つに特定できないから
主キーには、重複しないことが保証された番号などを使う。
1 つの列だけではレコードを特定できないとき、複数の列を組み合わせて主キーにしたものを何というか?
複合キー
例えば成績の表で、「生徒番号」と「科目」の組み合わせで 1 行が決まる場合。
外部キーとは何か?
別の表の主キーを参照するために置いた列
生徒の表の「部活コード」は、部活の表の主キー「部活コード」を指す外部キー。これで 2 つの表を関連づける。
外部キーの列に、参照先の表に存在しない値(例: 部活の表に無い部活コード)を入れようとするとどうなるか?
DBMS が登録を拒否する(参照の整合性を保つ)
存在しない部活に所属する生徒、という食い違ったデータが生まれないようにしている。
3. 選択・射影・結合
根拠: 学習指導要領 情報Ⅰ-(4)-ア-(イ)
関係データベースからデータを取り出すときは、表に対して次の 3 つの操作を組み合わせます。
操作の結果もまた表になるので、続けて別の操作をかけられます。
表から、条件に合う行だけを取り出す操作を何というか?
選択
「学年が 1 の生徒」のように、行を絞り込む。列の数は変わらない。
表から、指定した列だけを取り出す操作を何というか?
射影
「氏名と学年だけ」のように、列を絞り込む。行の数は(重複をまとめなければ)変わらない。
2 つの表を、共通の列の値が等しい行どうしでつないで 1 つの表にする操作を何というか?
結合
生徒の表と部活の表を「部活コード」でつなぐと、生徒ごとに部活名まで並んだ表ができる。
4. 正規化
根拠: 学習指導要領 情報Ⅰ-(4)-ア-(イ)
注文の表に、注文のたびに顧客の氏名・住所まで書いていくと、同じ顧客の住所が何度も現れます。
住所が変わったときに一部の行だけ直すと、同じ顧客の住所が食い違ってしまいます。
関係データベースの表の正規化とは何か?
データの重複をなくすように、表を分割して整理すること
顧客の情報は顧客の表に 1 回だけ書き、注文の表には顧客番号(外部キー)だけを置く。
表を正規化する目的は?
同じデータを 1 か所だけに持ち、更新したときに内容が食い違わないようにするため
分けた表は、結合すればいつでも元の形で見られる。
練習問題
1 の節の「生徒の表」と「部活の表」を使う。
問 1 生徒の表から「学年が 1」の行を選択した結果の表を答えよ。
次の 2 行(列は 4 つのまま)
| 生徒番号 | 氏名 | 学年 | 部活コード |
|---|---|---|---|
| S01 | 青木 | 1 | B1 |
| S03 | 上田 | 1 | B2 |
選択は行を絞るだけなので、列はすべて残る。
問 2 生徒の表を「氏名」と「部活コード」で射影した結果の表を答えよ。
次の 4 行 2 列
| 氏名 | 部活コード |
|---|---|
| 青木 | B1 |
| 井上 | B2 |
| 上田 | B2 |
| 江藤 | B3 |
射影は列を絞るだけなので、行は 4 つとも残る。
問 3 「写真部に所属する生徒の氏名」を求めたい。どの操作をどの順にかければよいか。また結果を答えよ。
生徒の表と部活の表を「部活コード」で結合 → 部活名が写真部の行を選択 → 氏名で射影。結果は「井上」「上田」。
結合すると各生徒の行に部活名が付く。部活コードが B2 の井上と上田の行が写真部になるので、それを選択し、氏名の列だけを射影する。