関係代数
リレーショナルデータベースでは、ある表から演算して新しい表を作成することができる。この演算のことを関係代数という。関係代数には、関係演算と集合演算がある。
関係演算
選択、射影、結合などがある。
- 選択は、1つの表から条件を満たす行を取り出す演算
- 射影は、1つの表から条件を満たす列を取り出す演算
- 結合は、同じ値をもつ列を使って複数の表をつなぎ合わせる演算
集合演算
和演算、差演算、積演算(共通演算)、直積演算がある。
集合論の和集合、差集合、積集合、直積集合と対応する。
- 和演算は、2つの表のいずれかにある行を取り出す。両方にある場合は、いずれか1行を取り出す。
- 差演算は、引かれる表から引く表にある行を除いたものを取り出す。
- 積演算は、2つの表に共通している行を取り出す。
- 直積演算は、2つの表をかけ合わせること。2つの表のすべての行の組み合わせを得る。(クロス結合)
SQL
SQLには、DDL(Data Definition Language、データ定義言語)とDML(Data Manipulation Language、データ操作言語)の2つがある。
DDLはデータベースの構造や整合性制約を定義する。(CREATE SCHEMA, CREATE TABLE, GRANT, REVOKE, DROPなど)
DMLはデータベースへアクセス(追加、取得、更新、削除)するための言語。(INSERT, SELECT, UPDATE, DELETE)
SQLに関してはWEBエンジニアとして経験があれば勉強しなくても大丈夫かと。
SQLに不慣れな人は、独学でSQLを学びたい初心者向けオススメ入門書【まずはこの一冊を読め!!】でも紹介した「改訂第3版 すらすらと手が動くようになる SQL書き方ドリル (WEB+DB PRESS plus)」をやれば良いと思う。
実務でも役立つので資格関係なくやって損はない。
トランザクション処理
トランザクションは複数のSQL文を1つの処理としてまとめてデータベースに反映すること。(ざっくりだけど...)
排他制御
複数の端末から同一のデータベースにアクセスするとデータベースの内容に矛盾が生じてしまう。(同じデータを更新してしまうとか)
これを防ぐために排他制御という仕組みがある。
排他制御とは、2つのトランザクションA, Bがあり、トランザクションAがデータベースのある部分を更新している間、トランザクションBは同じ部分にアクセスできないようにする制御する仕組み。
排他制御の方法の1つにロック法というのがあり、ロック法には共有ロックと占有ロック(排他ロック)がある。
共有ロックは、読み取り時に行われるロック。トランザクションが読み取りのみの場合、他のトランザクションからの読み取りも許可するが、書き込みは禁止する。
占有ロック(排他ロック)は、書き込みが発生するときに行われるロック。占有ロック中、他のトランザクションはロックされた部分への読み取りも書き込みもできない。
デッドロック
デッドロックはトランザクションが互いに占有ロックをかけることで、資源が待ち状態になり、トランザクション処理が進まなくなること。
- トランザクションAがテーブルAに占有ロックをかける
- トランザクションBがテーブルBに占有ロックをかける
- トランザクションAがテーブルBにアクセスしようとすると、トランザクションBが占有ロックを書けているので待ち状態になる
- トランザクションBがテーブルAにアクセスしようとすると、トランザクションAが占有ロックを書けているので待ち状態になる
結果、トランザクションA, Bともに処理が進まなくなりデッドロック!!
占有ロックの順序が同じになるようにすれば、デッドロックは発生しない。
ACID特性と整合性制約
ACID特性
データベースを矛盾のない、一貫した状態に保つ考え方。
次の特性の頭文字を取ってACID特性という。
特性 | 意味 |
Atomicity(原子性) | トランザクションが完了したら、処理が完了したか、まったく行われていないかのどちらかである。 |
Consistency(一貫性) | トランザクションの完了に関係なく、データベースは一貫性が保たれている。 |
Isolation(独立性) | 複数のトランザクションを同時に実行しても、別々に実行しても結果は同じ。 |
Durability(持続性) | トランザクション完了後はその結果が維持されていなければならない。 |
整合性制約
データの完全性を検証するための条件。(データベースを矛盾のない状態に保つための諸条件)
整合性制約は、DDLで定義し、INSERT/UPDATE/DELETE 時にチェックされる。
整合性制約の例
- 参照制約(外部キー制約)
- 外部キーに対応するレコードが存在しなければならない
- キー制約(主キー制約)
- 主キーがNULLであってはならない、重複してはいけない(PRIMARY KEYで指定)
- 検査制約(CHECK制約)
- カラムの値を更新するとき、事前に設定した条件を満たしてないといけない
- 形式制約
- カラムの値が設定したデータ型や桁数などのデータ形式を満たしていなければならない
- 一意制約(UNIQUE制約)
- カラムの値が一意でなければならない