railsでもRDBを使っていますが、正確な定義や仕組みについて調べてみました。
RDBとは
リレーショナルデータベースの略。関係データベースと訳され、データを複数の 表 として管理し、表と表の関係を定義することで、複雑なデータの関連性を扱えるようにしたデータベース管理方式。
リレーショナルモデルとは
- 現実世界のデータを リレーション と呼ばれる概念を用いて表現するデータモデル。
- データモデルと言ってもER図等のモデリングツールとは別物。
- リレーショナルモデルは設計を目的とするのではなくどのように表現するか。
リレーションとは
アソシエーションなどからリレーションとは 関連付け とか テーブル同士の繋がり と認識してる方が多いですがこれは誤解です。
正確にはリレーションに相当するもはテーブルであり、見出しと本体のペアです。見出しとは0以上のattributeであり、名前とデータ型のペア。本体はattributeの集合であるタプルです。
リレーショナルモデルは集合である
前提としてRDBにNULLを入れてはならないとされています。
理由としてRDBは集合であるからであり、NULLがあることで集合としての意味をなさなくなるからですね。
このベン図によるとAの集合は 1,2,3
、Bが 2,3,4,5
、ABが 2,3
になります。
これをRDBに置き換えるとA,BがリレーションでありABはA,Bの導出表なります。attributeは数値でありデータが 1,2,3,4,5
ですね。
この時にNULLが存在するとAにもBにも存在することができなくなりRDBを集合として表現することができなくなります(言い換えるとDBに保存したデータを抜き出すことができなくなる)。
よってRDBにおいてNULL制約は必須なものになります。
RDBの値は追加、更新、削除はできない
普段railsを使う時にテーブルの値を追加したりすると思いますが本来RDBにおいてこれらの作業はできません。
RDBにおいてリレーションとはテーブルであり、テーブルに保存されるものはデータです。
プログラミングで例えるとa = 1
をした時にa
は変数であり、1
が値になります。a = 2
とすることで、更新したように見えますが実際はa
という変数を更新したのでありその中にある1
を2
に更新したわけではありません(それができると1という値の意味が変わってくる)。
RDBにおいて変数にあたるのがrelvarです(リレーションが保存されるもの)。.createなどで作っているものはテーブルに値を作成しているわけではなく、もともとあるrelvarと.createでできたタプルの和集合であり、その結果をrelvarに代入することでデータの追加をしているように見せかけています。
要するに
RDBはプログラミングとほとんで似ている(変数という概念がある)。
RDBは集合の理念を用いて作成されている。
SQLはRDB用に作られたものなのでこれらの規約を守れないと真価を発揮できない。
やってみて
普段使っているDBは論理からやってみるとすごいめんどくさい...
ただrails経由でDBを触っていると勘違いが多くて(追加できなかったりとか)とても勉強になった。