
大変お世話になっております。
反逆する武士
uematu tubasaです。
初回投稿日時:2025年4月29日(令和7年4月29日)
本日はデータベースの基礎知識として、スキーマ、正規化、DDL、DML、DCLについて簡単にまとめる記事になります。
興味の無い方はブラウザバックで戻っていただいて問題ありません。
拙ブログは政治経済系ですが、情報技術も取り扱うブログでございますので、何卒ご理解の程、よろしくお願いします。
スキーマとは
1つのDBの中に複数設定することができる名前空間のこと
階層化できないディレクトリ構造のようなものという認識でok
テーブルを含めた、全てのオブジェクトはいづれかのスキーマに必ず所属する(ディレクトリ構造と同じ)
スキーマが異なれば、同じ名前のテーブルを作成してもいい(ディレクトリ構造と同じ)
スキーマを省略してテーブルなどのオブジェクトを参照することができる(一般的に省略する)
省略した場合は、スキーマ検索パスに指定されているスキーマ内からオブジェクトを参照する
スキーマ検索パスは変更可能(postgresql.conf)
スキーマを作成、削除することもできる
PostgreSQLでDBを作成すると6つのスキーマが作成される(以下では、主なスキーマを表示)
最近は、Windowsの自宅PCの中に、データベースを勉強するための環境構築が容易です。
したがって、自宅PCの内部にて環境構築を行い、資格関連の勉強をしようと頑張っております。
今回取り上げますのが、スキーマという概念です。
ちょっと理解しにくいので、上記記事を参考にしながら理解を深めていきたいと思います。
例えば、pgAdmin4というデータベースを管理・開発するためのGUI(グラフィカルユーザーインターフェース)ツールがあります。
そこで、SQLの練習などをしようとした際には、以下のような階層が出現します。
データベース > スキーマ > デーブル
要するに、データベースが最上位階層で、テーブルが最下位階層になるのです。
問題は1つのデータベースの中に複数設定することができる名前空間であるスキーマです。
これが何のために存在しているのか、いまいち理解ができなかったのです。
スキーマの利点とは
スキーマの利点とは、まず第一に「テーブルの名前衝突の回避」であると考えます。
仮に、1つのデータベースにて複数のシステムのデータを管理する場合を考えてみましょう。
複数のシステムとは言え、汎用マスタや共通マスタなど、どのシステムでも使うだろうという汎用性の高いマスタはあります。
けれども、システムが違うため、汎用マスタや共通マスタの内容も違うものにしたくて、しっかり分けたいという技術的需要があります。
その場合、とあるデータベースの中に2つのスキーマを作ることで、同じ名前の汎用マスタを2つ作ることができるのです。
1つ目のスキーマをtest_schema、2つ目のスキーマをdevelop_schemaとします。
スキーマという概念が存在しない場合、commonという名称のテーブルを2つ作ることはできません。
しかしながら、test_schemaのcommon、そしてdevelop_schemaのcommonという同名のマスタを作ることができます。
なぜ同名のマスタを2つ作るべきなのかと言えば、開発者の負担を軽減するためなのです。
とあるIT現場で働くITエンジニアが複数のシステムのデータベースを把握するとき、同名ならば理解しやすいです。
また、Aというシステムのデータベースをそのまま流用してBというシステムのデータベースを構築する際、テーブルの名前変更が不要になります。
なぜならば、スキーマを変更することで、同名のテーブルを作ることができるからです。
テーブル構築の際のコピー&ペーストができるというのは心理的にも楽ですよ。
仮に、テーブル名を全く別のシステム用にアレンジするとなれば、名称変更の抜け漏れを心配しなければなりませんので。
また、別の利点としては、スキーマ単位でアクセス権を設定することができます。
例えば、特定のユーザーやロールに対して、あるスキーマ内のオブジェクトのみの読み取りおよび書き込みを許可するといった細やかな制御が可能です。
その結果、セキュリティレベルを向上させ、意図しないデータアクセスを防止することができます。
スキーマを新規作成する場合はCREATE SCHEMA [新規のスキーマ名];
例)CREATE SCHEMA test_schema;
スキーマの名称変更をする場合はALTER SCHEMA [変更前スキーマ名] RENAME TO [変更後スキーマ名]
例)ALTER SCHEMA test_schema RENAME TO new_schema
正規化とは
データの重複をなくし整合的にデータを取り扱えるようにデータベースを設計することを、データベースの正規化と呼びます。
正規化を行っておくと、データの追加・更新・削除などに伴うデータの不整合や喪失が起きるのを防ぎ、メンテナンスの効率を高めることができます。引用元:第4回 データベースの正規化
データベースの正規化とは、データの整合性を確保するために必要な手法と説明されることが多いです。
そして、第一正規化、第二正規化、第三正規化という三段階の正規化として紹介されます。
しかしながら、正規化に対する理解が浅く、資格試験で細かいところまで問われてしまうと一気に答えに詰まるということがあります。
本記事においては、正規化に関する理解を深めていきたいと思います。
第一正規化とは、繰り返し項目を排除する(繰り返しの列や、セル結合を排除)ことです。

上記の商品管理表を元に説明させていただきます。
商品管理表の仕入先、住所、代表者名、代表者連絡先は1つのレコードなのに、それに紐づく商品名から右側は3つのレコードに分かれています。
そもそもRDB(リレーショナルデータベース)として成り立っていないというか、このままだとテーブルに格納することすらできません。
言い換えるならば、仕入先、住所、代表者名、代表者連絡先がセル結合されてしまっており、これを排除する必要があるのです。

繰り返し項目もしくはセル結合されているのを解除した結果が、上記となり、少なくとも商品管理表というテーブルに格納できる状態にはなりました。
けれども、問題はまだあります。
仕入れ先の代表者名が変更になると、複数のレコードを更新しなければならないため不整合を生じる恐れがあります。
なぜならば、仕入先情報、商品情報、入荷履歴といった独立した情報をすべて同一のレコードで扱っているからです。
1つ買えるために、複数レコードに対してupdateするとなると、ミスが発生しやすいのでメンテナンス観点から駄目ですよね。
第二正規化、つまりはprimary keyに対してすべての非キー属性が完全関数従属(full functional dependency)するように変更するべきです。
完全関数従属とは、いずれのテーブルにおいても非キー属性はprimary keyに従属する形のことです。

商品テーブルにおいては、商品名がprimary keyであり、その商品名が決定すれば「1個当たりの金額」「備考」が決まります。
入荷テーブルにおいても、商品名がprimary keyであり、その商品名が決定すれば「仕入先」「入荷日」「入荷数」が決まります。
最後に、primary key以外の項目について項目同士で依存関係を持っているもの(推移的関数従属と言います)も、別テーブルに切り分ける第三正規化を実施します。
なぜならば、津軽ファームの代表者である陸奥太郎さんが他の農園の代表も兼任しているとしたら複数レコードを更新する必要があるからです。

要するに、第二正規化だけだと「仕入先」が決まると「住所」と「代表者名」と「代表者連絡先」が決まりますが、この状態では関係従属がもう一つ含まれています。
「代表者名」が決まると「代表者連絡先」が決まるため、第二正規化のテーブルだと複数の関係従属が含まれてしまっており、これを解消するべきなのです。
上記のように、第三正規化の4つのテーブルだと、primary keyが決まると非キーが決まるという簡素な関係に落ち着きます。
DDL、DML、DCLとは
DDL(Data Definition Language)はデータ定義言語と呼ばれ、テーブルや索引、シーケンスなどのデータベースオブジェクトを定義する言語です。
データベースやテーブルを新規に作成(CREATE)する場合や、変更(ALTER)、削除(DROP)する際に使用します。
また、テーブルに格納されているデータを一括ですべて削除するTRUNCATEも、DDLに含まれます。DML(Data Manipulation Language)はデータ操作言語と呼ばれ、データベースを操作し、格納されているデータの検索や削除などを行うための言語です。
データベースを使用する中で最も使用する言語と言えます。
命令文は、データの検索(SELECT)、更新(UPDATE)、挿入(INSERT)、削除(DELETE)があります。DCL(Data Control Language)はデータ制御言語と呼ばれ、データやトランザクションを制御するための言語です。
ユーザーに対してアクセス権限を付与(GRANT)する命令や、権限の取消(REVOKE)が含まれます。
資格試験の場合、いわゆる三文字のアルファベットは鬼門なのです。
なぜならば、内容をしっかり理解しないといざ試験本番で思い出すことができないからです。
DDLはCREATE、ALTER、DROPの場合に該当します。
テーブルそのものを新規作成、変更、削除する場合はDDLは該当します。
DMLはレコードを操作する場合、SELECT、UPDATE、INSERT、DELETEに該当します。
一般的なSQLというのもこれになりますし、現場でよく使いますね。
DCLは権限とトランザクションのアクセス権限を付与(GRANT)する命令や、権限の取消(REVOKE)に該当します。
トランザクションはBEGIN、COMMIT、ROLLBACKが該当し、DCLに含まれるようです。
以上です。