テーブルとは何か?
二次元表≠テーブル
テーブルとは、共通点を持ったレコードの集合である。
テーブル名は英語ならば複数形/複数名詞で書ける。そうでなければそのテーブルにはどこか間違いがある。
- 特に共通点のないレコードを寄せ集めた二次元表は「テーブル」ではない
-
テーブル
- 同じ種類の物の集合
- 「テーブル名はすべて複数形または複数名詞で書ける」 by ジョー・セルコ
-
現実世界と結びついた意味を持っていること
- これを踏み外すと間違った設計が生ずる
テーブルの構成要素
行と列
- レコードとカラム、とも
キー
外部キーは人間の親子関係と同じ。
外部キーが設定されている場合、データの削除は子から順に操作するのが吉。
キーとなる列には、コードやIDなど表記体系の定まった固定長文字列を用いる。
- 特定のデータを引き出すためのもの
-
特に重要なもの
- 主キー
- 外部キー
主キー (primary key)
- 必ず1つ必要で、かつ1つだけしか存在しない
-
1つのレコードを特定できる
- 「社員名」とかは原理的に同性同名が存在しうるから主キーにならない
-
関連する概念
-
候補キー
- 主キーとして利用可能な複数候補のうち主キーでないもの
-
スーパーキー
- 主キーのスーパーセット
- 主キー
(A,B)
にCを加えて(A,B,C)
にしたやつ
-
外部キー (foreign key)
-
テーブル間の列同士で設定する
- 例: 社員テーブルの部署カラム(FK)が、部署マスタの部署カラム(PK)を参照する
-
参照整合性制約
- 例: 部署マスタに存在しない値が、間違って社員テーブルに登録されないようにする
-
参照されるやつ: 親にあたる
- 子は親がいないと存在できない
- 子のいない親は存在しうる
-
親が削除(もしくは変更)されたら、親のいない子はどうなる?
-
設定次第
-
カスケード
- 親のいない子も削除する
- 削除SQLをエラーにする
-
-
-
こうした厄介な問題を考えないようにテーブル操作するのが一番
- 子を先に削除する
どのような値をキーにするか
-
可変長文字列はよくない
- 同じ名前でも微妙に異なる表記になったりする
- 表記体系の定まった固定長文字列を使え
制約
テーブル定義において、列には可能な限りNOT NULL制約を付加する。
-
いろいろある
- 参照整合性制約(前述)
- NOT NULL制約
- 一意制約
- CHECK制約
NOT NULL制約
-
NULL
-
値がないことのマーク
- NULLという値があるわけではない
-
-
NULLはいろいろと厄介
- 【補】排中律が破れたりとか
-
NOT NULL制約
-
NULLを禁止する
- 極力禁止せよ
-
- 主キー列は暗黙のNOT NULL
一意制約
-
何個でも設定できる
- cf. PKは1つ
CHECK制約
-
定義域の制限
- 数値の上限・下限
- 列挙値
テーブルと列の名前
テーブルや列の名前に日本語はご法度。
-
名前に使える文字集合
- alnum
_
- 最初はアルファベット
-
重複してはならない
-
範囲
- テーブルの中では、同じ列名は使用不可
- ドメイン(DBMSによってはスキーマとも)の中では、同じテーブル名は使用不可
-
コラム: 関係(リレーショナル)とは何か
pp.81-83
アドレスとポインタを追放した的な話など(略)