データベース(DB)を扱う上で、スキーマという用語が出てきます。このスキーマという用語、調べてもなかなか理解できないというか、腑に落ちない部分が多かったです。
その理由として、調べた先の説明が良くないとかそういうわけではなく、スキーマという用語が複数の意味を持ち合わせているところにありました。どの場面におけるスキーマを指しているかによって、意味が変わってくるのです。
筆者自身も完全に理解できているとは思っていませんが、理解した内容を整理してみようと思います。
DBの概念としてのスキーマ
データベースを設計・管理するにあたり、データベースの構造や形式を定義し把握しておく必要があります。
このデータベースの構造・形式というのが厄介で、一筋縄で簡単に説明できるものではなく、概念的なものになっています。一般的に「外部スキーマ、概念スキーマ、内部スキーマ」といった3層スキーマという構造がよく知られています。
3層スキーマとは
3層スキーマとは正確にはANSI/SPARC3層スキーマアーキテクチャと呼ばれます。先述のように「外部スキーマ、概念スキーマ、内部スキーマ」とデータベースを3つの概念に分割し、構造全体を定義しようとする考え方です。データベース全体の構造を一言で言い表すのは容易ではありません。なので、このように3つの要素に分けてそれぞれを定義することで、全体を表現しようとしています。
3層スキーマの特徴として、3つのそれぞれの層は他の層と独立しているという点が挙げられます。いずれかの層に変更を加えた場合でも、他の層に影響を及ぼすことはありません。
外部スキーマ
実際にユーザがアクセスするスキーマで、RDBではビューがここに当たります。実世界が変化したとしてもユーザが利用する応用プログラムには影響しないという論理的データ独立性を持っています。
概念スキーマ
データとして必要な現実世界のデータ全体を定義し、特定のアプリケーションに依存しないようなデータ構造を定義するのが概念スキーマです。
RDBでは実表(テーブル)全体を指します。技術者が設計等で触れるスキーマはこの概念スキーマです。
内部スキーマ
内部スキーマは概念スキーマをコンピュータ上に実装するためのスキーマです。実世界が変化したとしても、データベースそのものは影響を受けないという物理的データ独立性を持っています。
DBの構造としてのスキーマ
これまでの内容はDB全体の概念としてのスキーマでしたが、RDB個別にスキーマなる枠組みも存在します。
たとえばPostgreSQLでは、データベースやテーブルといった単位としてスキーマが存在します。
このようにスキーマはデータベースとテーブルの間の単位として存在します。図からわかるように、ここでのスキーマはテーブル(あるいは関数)をグループ化するためのものです。
スキーマの使用が推奨される理由として、
- 1つのデータベースを多数のユーザが互いに干渉することなくしようできるようにするため
- 管理しやすくなるよう、データベースオブジェクトを論理グループに編成するため
- サードパーティのアプリケーションを別々のスキーマに入れることにより、他のオブジェクトの名前と競合しないようにするため
https://www.postgresql.jp/document/9.4/html/ddl-schemas.html
が挙げられています。要はデータベースという1つの箱でぐちゃぐちゃにしているよりも、その中でまとまりのある箱をいくつか作って整理しておいた方がテーブルやユーザのアクセス権限の管理が楽だよねっていう話です。
ちなみにPostgreSQLではデフォルトでpublicというスキーマが作成されます。
まとめ
データベースにおけるスキーマについて内容を整理してみました。概念的なスキーマと、各DBの構造としてのスキーマが存在していて、ここが混同するとややこしいです。
Webサイトや書籍で調べ物をする際は、どっちのことを言っているかは明らかにしておく必要がありそうです。
ではでは👋