はじめに
この本では、SQLの文法やMySQLなど特定の製品についての知識は書かれていません。 前半でリレーショナルモデルとSQL、DB設計理論(正規化・直交性)について、後半ではリレーショナルモデル以外の知識(キャッシュ、インデックス、トランザクションなど)が解説されています。
わたしはまさにSQLの文法や特定の製品についての知識しかなく苦手意識を持っていたので(WordPress周りのDBしかまともに触ったことがなく、SQLって本当に言語というほど複雑なのか?GUIでぽちぽちして十分…などと思っているレベルでした)、この本を読んで基礎から学ぼうと思いました。
学んだこと
そもそもリレーションって何だ
リレーション(関係)という言葉ではあるが、UML図で表すようなテーブル同士の関係を表すわけではなく、テーブルそのもののことを指す。 テーブルなので見出しと本体を持っている。
リレーショナルモデルでは現実世界のデータをリレーションを用いて表現している。
リレーションは集合論に根ざしている。 データベースを集合としてとらえ、クエリはその演算だと考えると理解しやすい。(数学でやったベン図を思い出す) 集合の要素(データ)は、重複せずまたそれ以上分割することもできない。
ドメイン設計とは
リレーショナルモデルにおいて、ドメインとはデータ型(intとかtextとか)のこと。 もちろんデータ型も集合である。
データ型という集合の要素一つ一つをデータとして考えてみると、データそのものは変化しないが、その中からクエリで選択した値(変数)は変化することが理解できる。
Nullの何が悪いのか
Nullは本来、集合にはない概念である。 値が存在しない、または存在はするが未知であることを表している。
Nullを許容してしまうと、実際の値が何なのかわからなくなる。 同じ値なのか違う値なのか、Null同士結合していいのかもわからない、ただの未知なものになってしまう。
リレーショルモデルでは、このような状況では正しい演算ができなくなる。
SELECTは3つの演算を行なっている
よくあるSELECT文のサンプルで考える。
SELECT テーブル1.カラム1
FROM テーブル1 INNER JOIN テーブル2
WHRE テーブル1.カラム3 = テーブル2.カラム4
ここで理解できるのは、SELECT文は3つの演算処理を行っているということ。 テーブル1とテーブル2の直積に対し、WHERE句の検索条件で制限をかけながら、テーブル1のカラム1を射影(結果を出力)している。
トランザクションとは何か
トランザクションは、データを正しく保つために考案された手法。 RDBでは、同時に複数でアクセスすることによって起こるデータの不整合を防いだり、サーバがクラッシュして処理が中途半端になった時のリカバリに使う。
SQLのテーブルが特殊な性質を持っていることによって、トランザクションという概念が生まれる。
テーブルは、リレーションの値であり、変数の性質も持っている。 値とは更新できず変更だけができるもので、変数は更新ができるもの。テーブルは両方の性質を持っているので、変更することも更新することもできてしまう。 データの不整合を防ぐために、リレーショナルモデルで正規化を行い直交性を保った上で、トランザクションを使う。
終わりに
リレーションは集合の図で理解できる、ということを知って目から鱗でした。 今回はほぼ前半のリレーショナルモデルについて理解するのでいっぱいいっぱいだったので、もう少し成長してから再び読みたいです。SQLアンチパターンも読むぞ。
上半期は隔週末に1冊本を読んで、ブログ書きたいなと思っています。(できるかな)