🔖

PostgreSQLの"スキーマ"について

に公開

はじめに

私はもともと、MySQLしか使ったことがありませんでした。
初めてPostgreSQLを触ったとき、
最初に戸惑ったのが 「スキーマ」という概念 です。

本記事では、PostgreSQLの「スキーマ」について解説します。

MySQLの場合

MySQLでは、
データベースに入るとすぐにテーブルが並んでいるのが普通で、
基本的にすべてのケースでそうなっています。

MySQLの場合は、次のような構成です。

データベース(例:mydb)
  ├── users
  ├── orders
  ├── products

「データベース=テーブルがたくさん入った箱」という認識でした。

PostgreSQLの場合

初めてPostgreSQLに触れたとき、戸惑いました。

データベースに入っても、
いきなりテーブルが見えるわけではなかったのです。

PostgreSQLでは、次のような構成になっています。

データベース(例:mydb)
  ├── スキーマ(例:public)
        ├── users
        ├── orders
        ├── products

つまり、データベースの中に「スキーマ」というフォルダがあり、その中にテーブルがあるのです。

スキーマとは

一言で言うと、
スキーマは「テーブルを整理するためのフォルダ」のようなものです。

さらに、スキーマには以下のような役割があります。

  • テーブルをグループ分けできる
  • 同じデータベース内に、名前が同じでも違うスキーマに作ればOK
    • 例:sales.userssupport.users
  • スキーマ単位でアクセス権限を管理できる

この仕組みが存在する理由

PostgreSQLは、もともと
「大規模システム向けに使う」 ことを想定して作られています。

  • テーブル数が何百、何千と増える場合に、スキーマで整理できたほうが便利
  • チームごとにスキーマを分けて、アクセス制御できる

こういった大規模開発向けの思想が背景にあります。

実際につまづいたポイント

私自身がつまずいたのは、以下の点でした。

  • テーブルを探すとき、スキーマを指定しないと見つからない
  • SQLを書くとき、public.users みたいにスキーマ名.テーブル名で指定することがある
SELECT * FROM public.users;

最初は、SQLを書くたびにpublic.とスキーマ名を付けるのが少し煩わしく感じました。
「なぜ毎回スキーマ名を指定しなければいけないのだろう?」と戸惑ったのを覚えています。

しかし、慣れてくると考え方が変わりました。
「このテーブルはどのグループ(スキーマ)に属しているか」がすぐわかるため、
意外と便利だと感じるようになりました。

おわりに

PostgreSQLの「スキーマ」という概念は、
大規模なシステムでは必ず役立つ整理の仕組みです。

もし今、

「スキーマって何?」
「publicって何?」

と戸惑っている方がいたら、
それは全く自然なことです。

本記事が、PostgreSQLに初めて触れる方や触れたばかりの方の一助となれば幸いです。

Discussion