感謝のプログラミング 10000時間

たどり着いた結果(さき)は、感謝でした。

主キーと外部キーの話。

<スポンサーリンク>

用語

スキーマ(schema)とは、テーブルや列といったデータベース内のすべての構造の表現やそれらの接続方法のことを指す。

1つのテーブルを2つにする

たとえば、以下のようなテーブルがあったとする。

person
person_id
last_name
first_name
interests
gender

interestsというのは興味ということだけれど、興味があることは「プログラミング,買い物」のように複数あるかもしれない。
このように1つの列に複数、というのは「原子的」ではない。

原子的であるというのはどういうことかというと、

  • 原子的なデータを持つ列は、その列に同種のデータの値を複数持てない
  • 原子的なデータを持つテーブルは、同種のデータを持つ列を複数持てない

というもの。
で、データを原子的にすることは、正規化されたテーブルを作る最初のステップにもなる。

この2番めの、同種の列を複数持てないっていうのは、たとえばinterest1,interest2みたいに複数の列を持ってはいけないということ。

じゃあ、このinterests君をどうするかというと、別のテーブルにする。

interests
interest_id
interest
person_id

こんな感じ。で、上のpersonテーブルからはinterestsを取り除く。
こんな風にすると、「プログラミング」を趣味にしている人は誰なのか、すぐにSELECTすることができる。

さて、personテーブルとinterestsテーブルを結ぶものに、person_idを使った。
このperson_idはpersonテーブルの主キーである。
このようにあるテーブル(ここではinterestテーブル)で、別のテーブル(ここではperson)の主キーを参照している列を「外部キー(foreign key)」という。
ちなみに、主キーとは、各レコードを一意にするテーブル内の列のことである。
外部キーは一意である必要は無いし、NULLにもできる。主キーをNULLにすることはできない。

外部キーに挿入できるのは、そのキーの参照元のテーブル、すなわち、親テーブルに存在している値だけである。
これを参照整合性(referntial integrity)と呼ぶ。
上記のinteretsテーブルを外部キーを使って作成するSQLはこんな感じになる。

CREATE TABLE interests
interest_id NOT NULL AUTO_INCREMENT PRIMARY KEY,
interest VERCHAR(50) NOT NULL,
person_id INT NOT NULL,
CONSTRAINT person_person_id_fk
FOREIGN KEY (person_id)
REFERENCES person (person_id)

CONSTRAINTの部分は、キーがどのテーブルから来ているのかわかるようにしている。
REFERENCES person(person_id)
というのは、外部キーがどのテーブルからきたか(person)と、カッコの中はそのテーブル(person)での列名を指定している。

勉強した本

Head First SQL ―頭とからだで覚えるSQLの基本

Head First SQL ―頭とからだで覚えるSQLの基本


ふざけているように見えてめちゃくちゃいい本。
データベース設計の基礎の勉強にもなる。
買ってよかった。

感謝のプログラミング

今回で感謝のプログラミングは【536時間目】
10000時間まで、あと【9464時間】

別の勉強した分の1時間を追加している。