第 9 章 データベース
表で世界を整理する。この章では次の 15 個の知識点を、解説・インタラクティブ教材・練習問題で学びます。
データベースと DBMS・関係データベース
データベースは決まった形で整理されたデータの集まり、それを操作・制御するソフトウェアが DBMS(ミドルウェアの一種)。代表は表形式の 関係データベース(RDB)で、ほかに階層型・ネットワーク型がある。表の 1 行=レコード(行・組・タプル)、1 列=フィールド(列・属性)。
3層スキーマ
データベースの構造を 外部スキーマ(利用者・アプリから見た見え方)、概念スキーマ(データの論理的な構造)、内部スキーマ(記憶媒体への物理的な格納)の 3 つに分けて定義する(3層スキーマ)。分けておくと、一方を変えても他方に影響しない=データの独立性が高まる。
主キー・複合キー・外部キー
主キーは行を 1 つに特定できる列。値が重複しない一意制約と、空(NULL)でない非 NULL 制約の両方を満たす。1 列で特定できなければ複数列を組み合わせた複合キーにする。外部キーは他の表の主キーを参照する列で、参照先に存在する値しか入れられない(参照制約)。
正規化と関数従属
データベースの正規化は、重複や矛盾が起きないように表を分割すること。第1正規形:繰返し項目をなくし、計算で求まる列を除く。第2正規形:複合キーの一部だけで決まる列(部分関数従属)を別表へ。第3正規形:主キー以外の列で決まる列(推移的関数従属)を別表へ。「A が決まれば B が 1 つに決まる」関係が関数従属(A → B)。
トランザクションと ACID 特性
トランザクションは、まとめて扱う一連のデータベース処理(例:振込=A の口座を減らす+B の口座を増やす)。満たすべき性質が ACID特性:原子性(全部やるか全くやらないか)・一貫性(矛盾がない)・隔離性(同時に実行しても互いに影響しない)・耐久性(確定した結果は障害でも消えない)。
排他制御・デッドロック・ロックの粒度
同じデータを同時に更新すると、一方の更新が消えることがある(ロストアップデート)。これを防ぐのが排他制御(ロック)。共有ロックは他者の読取りは許すが更新は禁止、専有ロックは読取りも更新も禁止。互いに相手のロック解放を待ち続けるのがデッドロック。ロックの粒度が大きいと管理は簡単だが待ちが増え、小さいと並行性は上がるが管理が大変。
ストアドプロシージャ
ストアドプロシージャは、よく使う SQL の命令群をひとまとめにして、あらかじめ DBMS(サーバ側)に登録しておく仕組み。クライアントは「呼び出す」命令を 1 回送るだけでよいので、ネットワークの負荷が減り、処理速度も上がる。
障害回復(ジャーナル・ロールバック・ロールフォワード)
データベースはバックアップファイル(定期的なコピー)とジャーナルファイル(更新履歴:更新前と更新後の値)で守る。トランザクション中のエラー → 更新前ジャーナルで開始前に戻す ロールバック(バックワードリカバリ)。ディスク障害 → バックアップ+更新後ジャーナルで障害直前まで戻す ロールフォワード(フォワードリカバリ)。すべて成功したら コミット で確定。
分散データベースと 2 相コミット
分散データベースは、複数の場所にあるデータベースを見かけ上 1 つのデータベースとして扱う仕組み。1 つのトランザクションが複数サイトを更新するときは 2相コミット:第 1 相で全サイトに「コミットできるか」を問い合わせ、第 2 相で全員が可能ならコミット、1 つでも不可なら全サイトでロールバックする。
関係演算(選択・射影・結合)
表から新しい表を作る操作が関係演算。選択=条件に合う行を取り出す、射影=指定した列を取り出す、結合=共通の列の値で 2 つの表をつなぐ。こうして一時的に作った仮想の表がビュー。
SQL の分類(DDL・DML・DCL)と制約
SQL は 3 種類。DDL(データ定義):CREATE(表・ビューを作る)・DROP(削除)・ALTER(変更)・TRUNCATE(全行を一括削除)。DML(データ操作):SELECT・INSERT・UPDATE・DELETE。DCL(データ制御):GRANT(権限を与える)・REVOKE(取り消す)。CREATE TABLE では PRIMARY KEY・REFERENCES(外部キー)・UNIQUE・CHECK・NOT NULL の制約を付けられる。
DML の基本構文(SELECT・UPDATE・DELETE・INSERT)
SELECT 列 FROM 表 WHERE 条件(取り出す)、UPDATE 表 SET 列 = 値 WHERE 条件(更新)、DELETE FROM 表 WHERE 条件(削除)、INSERT INTO 表 (列, …) VALUES (値, …)(追加)。WHERE を省略すると全行が対象になる。
SELECT 文(条件・結合・並べ替え)
WHERE では比較演算子(= <> < <= > >=)と論理演算子(AND・OR・NOT)で条件を書く。SELECT * は全列。FROM 表1, 表2 WHERE 表1.列 = 表2.列 で表を結合(同じ名前の列は「表名.列名」で区別)。ORDER BY 列 [ASC|DESC] で並べ替え(ASC=昇順は省略可、DESC=降順)。
GROUP BY・集合関数・HAVING
GROUP BY 列 で同じ値の行をグループにまとめ、集合関数(SUM 合計・AVG 平均・COUNT 件数・MAX 最大・MIN 最小)でグループごとに集計する。WHERE は行を、HAVING はグループを選ぶ。実行順序は FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY。
新シラバス用語(列指向データベース・グラフデータベース)
関係データベース以外のデータベースをまとめて NoSQL と呼ぶ。列指向データベース:通常は行単位で扱うデータを列単位でまとめて格納する。特定の列の集計・分析が速い。グラフデータベース:データをノード(点)とエッジ(線)のグラフ形式で保存し、SNS の友人関係のような「つながり」をたどる検索が得意。