PostgreSQLの"スキーマ"について
はじめに
私はもともと、MySQLしか使ったことがありませんでした。
初めてPostgreSQLを触ったとき、
最初に戸惑ったのが 「スキーマ」という概念 です。
本記事では、PostgreSQLの「スキーマ」について解説します。
MySQLの場合
MySQLでは、
データベースに入るとすぐにテーブルが並んでいるのが普通で、
基本的にすべてのケースでそうなっています。
MySQLの場合は、次のような構成です。
データベース(例:mydb)
├── users
├── orders
├── products
「データベース=テーブルがたくさん入った箱」という認識でした。
PostgreSQLの場合
初めてPostgreSQLに触れたとき、戸惑いました。
データベースに入っても、
いきなりテーブルが見えるわけではなかったのです。
PostgreSQLでは、次のような構成になっています。
データベース(例:mydb)
├── スキーマ(例:public)
├── users
├── orders
├── products
つまり、データベースの中に「スキーマ」というフォルダがあり、その中にテーブルがあるのです。
スキーマとは
一言で言うと、
スキーマは「テーブルを整理するためのフォルダ」のようなものです。
さらに、スキーマには以下のような役割があります。
- テーブルをグループ分けできる
- 同じデータベース内に、名前が同じでも違うスキーマに作ればOK
- 例:
sales.users
とsupport.users
- 例:
- スキーマ単位でアクセス権限を管理できる
この仕組みが存在する理由
PostgreSQLは、もともと
「大規模システム向けに使う」 ことを想定して作られています。
- テーブル数が何百、何千と増える場合に、スキーマで整理できたほうが便利
- チームごとにスキーマを分けて、アクセス制御できる
こういった大規模開発向けの思想が背景にあります。
実際につまづいたポイント
私自身がつまずいたのは、以下の点でした。
- テーブルを探すとき、スキーマを指定しないと見つからない
- SQLを書くとき、
public.users
みたいにスキーマ名.テーブル名で指定することがある
SELECT * FROM public.users;
最初は、SQLを書くたびにpublic.
とスキーマ名を付けるのが少し煩わしく感じました。
「なぜ毎回スキーマ名を指定しなければいけないのだろう?」と戸惑ったのを覚えています。
しかし、慣れてくると考え方が変わりました。
「このテーブルはどのグループ(スキーマ)に属しているか」がすぐわかるため、
意外と便利だと感じるようになりました。
おわりに
PostgreSQLの「スキーマ」という概念は、
大規模なシステムでは必ず役立つ整理の仕組みです。
もし今、
「スキーマって何?」
「publicって何?」
と戸惑っている方がいたら、
それは全く自然なことです。
本記事が、PostgreSQLに初めて触れる方や触れたばかりの方の一助となれば幸いです。
Discussion