変更要約: 初版(主題S1・S1.1〜S1.2)
1.2リレーショナルDBの一般知識
リレーショナルデータモデルの基本概念(テーブル・行・列・主キー・外部キー)と DBMS が担う役割を整理します。SQL の一般知識、そして SQL を用途別に分類する DDL(データ定義言語)・DML(データ操作言語)・DCL(データ制御言語)の3分類、さらにデータベース設計における正規化の考え方を押さえます。
前節で PostgreSQL というソフトウェア・プロジェクトの姿を学びました。この節では、その PostgreSQL が実装しているリレーショナルデータベースという考え方そのものに焦点を当てます。第3章で個別の SQL 構文(SELECT・CREATE TABLE 等)を学ぶ前に、データモデルの基本概念とSQL を3分類する考え方を理解しておくと、以降の学習で迷いにくくなります。
1.2.1リレーショナルデータモデルとDBMSの役割
- リレーショナルデータモデル=データをテーブル(表・リレーション)の集合として表現するモデル。1つのテーブルは行(レコード・タプル)の集まりであり、各行は列(カラム・属性)の値で構成される。
- 主キー(PRIMARY KEY)=テーブル内の各行を一意に識別する列(または列の組)。外部キー(FOREIGN KEY)=あるテーブルの列が別テーブルの主キーを参照し、テーブル間の関連(リレーションシップ)を表現する仕組み。
- DBMS(データベース管理システム)の役割=データの永続化・検索の効率化に加え、複数ユーザーの同時アクセス制御、障害からの回復(リカバリ)、トランザクションの整合性保証、アクセス権限の管理までを一手に担うソフトウェア基盤。
1.2.2SQLの一般知識と3分類(DDL/DML/DCL)
- SQL(Structured Query Language)=リレーショナルデータベースを操作するための標準化された言語。特定のベンダーに依存しない共通の構文体系を持ち、PostgreSQL も標準 SQL への準拠度の高さを特徴とする。
- DDL(Data Definition Language・データ定義言語)=テーブルやビュー、インデックスなどの構造(スキーマ)を定義する。代表例=
CREATE・ALTER・DROP。 - DML(Data Manipulation Language・データ操作言語)=テーブルに格納されたデータそのものを操作する。代表例=
SELECT(検索)・INSERT(追加)・UPDATE(更新)・DELETE(削除)。 - DCL(Data Control Language・データ制御言語)=データベースオブジェクトへのアクセス権限を制御する。代表例=
GRANT(権限付与)・REVOKE(権限剥奪)。トランザクション制御のCOMMIT/ROLLBACKを DCL に含める分類法もある。
1.2.3データベース設計と正規化
- データベース設計=業務で扱うデータを、どのテーブルにどの列を持たせ、テーブル間をどう関連付けるかを決める作業。設計の良し悪しが、後々のデータ整合性・保守性・性能に大きく影響する。
- 正規化=1つのテーブルに詰め込まれたデータを、重複を減らし更新時の不整合を防ぐ目的で複数のテーブルに整理し直す設計手法。段階的な基準(正規形)に沿って進める。
- 正規化は段階的な正規形として整理を進める。第1正規形(1NF)=繰り返し項目をなくし各列を単一値にする、第2正規形(2NF)=主キーの一部にだけ依存する列(部分関数従属)を別テーブルへ分離、第3正規形(3NF)=主キー以外の列に依存する列(推移的関数従属)を別テーブルへ分離。実務では多くの場合 3NF までを目安に整理する。
- 正規化が不十分だと、同じ情報が複数行に重複して保存され、更新時に一部の行だけ更新漏れが起きる更新異常が発生しやすい。正規化によってこうした重複と異常を整理し、外部キーで関連を表現し直すのが基本的な考え方。
「構造を定義=DDL(CREATE/ALTER/DROP)」「データを操作=DML(SELECT/INSERT/UPDATE/DELETE)」「権限を制御=DCL(GRANT/REVOKE)」というSQLの3分類と代表コマンドの対応付けが最頻出です。正規化の目的=重複の削減と更新異常の防止であって「検索速度の向上そのもの」が主目的ではない点も定番の対比として問われます。
架空の受講生管理システムを設計する流れで、この節の概念を一通り確認しましょう。最初、担当者は「受講生」テーブル1つに、氏名・連絡先に加えて受講中の講座名も列として直接書き込む設計を考えたとします。しかし1人が複数講座を受講すると同じ受講生の氏名・連絡先が講座数だけ重複してしまい、住所変更の際に一部の行だけ更新し忘れる更新異常が起きやすくなります。ここで正規化の出番です。「受講生」テーブルと「講座」テーブルに分割し、両者の関連を表す「受講」テーブルを新設して、各テーブルの主キーを外部キーとして参照させることで、氏名や講座名の重複を排除します。テーブル構造が固まったら、まず DDL の CREATE TABLE で3つのテーブルを作成し、必要な制約(主キー・外部キー)を定義します。次に DML の INSERT で実データを登録し、日々の業務では SELECT で受講状況を検索し、住所変更があれば UPDATE で「受講生」テーブルの1行だけを更新すれば済みます(正規化のおかげで更新箇所が1箇所に収まる)。最後に、事務担当者には受講生テーブルの参照権限のみを DCL の GRANT SELECT で付与し、更新権限は管理者だけに限定します。この一連の流れ全体をDBMS(この場合は PostgreSQL)が、同時アクセス制御やトランザクションの整合性保証を通じて裏で支えています。
| 分類 | 目的 | 代表コマンド |
|---|---|---|
| DDL | 構造(スキーマ)の定義 | CREATE / ALTER / DROP |
| DML | データそのものの操作 | SELECT / INSERT / UPDATE / DELETE |
| DCL | アクセス権限の制御 | GRANT / REVOKE |
ひっかけ: 「CREATE TABLE はデータ操作言語(DML)に分類される」は誤りです。CREATE はテーブルという構造を定義するコマンドでありDDLに分類されます。また「正規化の主目的はクエリの実行速度を高速化することである」も誤り=正規化の主目的はデータ重複の削減と更新異常の防止であり、テーブル分割によって結合(JOIN)が増え、場合によっては検索が単純な非正規化構造より遅くなることもあります。
1.2.4この節のまとめ
- リレーショナルデータモデル=テーブル(行×列)+主キー/外部キーで関連を表現。DBMSが同時アクセス・回復・トランザクションを支える
- SQLの3分類=DDL(CREATE/ALTER/DROP・構造定義)/DML(SELECT/INSERT/UPDATE/DELETE・データ操作)/DCL(GRANT/REVOKE・権限制御)
- 正規化の目的=重複の削減と更新異常の防止(検索高速化そのものが目的ではない)
進捗の記録にはログインが必要です。
理解度チェック
(軽い確認用)Q1. 「受講生」テーブルに講座名を直接列として持たせたところ、1人が複数講座を受講すると氏名が講座数だけ重複し、住所変更時に一部の行だけ更新漏れが起きた。この問題への適切な対処はどれ?
Q2. `CREATE TABLE`・`GRANT`・`SELECT` の3つのSQL文を、データ定義言語(DDL)・データ操作言語(DML)・データ制御言語(DCL)に正しく分類したものはどれ?
Q3. データベース設計における正規化の主目的として最も適切なものはどれ?

