はじめに
PostgreSQL 周りで作業していて、「あれ、PostgreSQL ってどういう構造だっけ?」と迷う瞬間があったので、
Database → Schema → Table の関係を中心に、あらためて整理してみました。
1. PostgreSQL の基本構造
① Database(データベース)
PostgreSQL の“最上位の入れ物”。
データベースごとに完全に独立。
- データは DB ごとに隔離される
- 同名テーブルが別 DB にあっても問題なし
- アプリごとに DB を分けると管理しやすい
例:
product_db ← 商品管理
billing_db ← 請求管理
② Schema(スキーマ)
1つのデータベースの中に作れる“フォルダ(名前空間)”。
テーブル・ビュー・関数などをまとめる役割があります。
例:
public ← デフォルト
sales ← 営業システム
accounting ← 会計アプリ
スキーマを使う利点:
- テーブル名の衝突を防げる
- 権限管理がしやすい
- 1つの DB に複数アプリを共存させられる
③ Table(テーブル)
実際のデータが入る「表」。
テーブルは必ずスキーマの下に作られる。
例:
customers ← 顧客
orders ← 注文
invoice_items ← 請求明細
3. PostgreSQL の “デフォルトスキーマ” について
PostgreSQL で CREATE DATABASE すると、内部的にいくつかのスキーマが自動生成される。
代表例:
| スキーマ | 説明 |
|---|---|
| pg_catalog | PostgreSQL のシステム情報(超重要) |
| information_schema | 標準SQLで定義されたメタデータ |
| pg_toast | 大きなデータの内部管理用 |
| public | ユーザーが最初に使う“標準スキーマ” |
普段使っていくのは public、または自分で作るアプリ専用スキーマです。
4. スキーマ検索パス(search_path)
実際には FROM sales.customers のようにスキーマを明示しなくても、
SELECT * FROM customers;
だけで動く。
これは PostgreSQL が
SHOW search_path;
で指定されている順にスキーマを探してくれるから。
5. 権限の付け方
PostgreSQL は、基本的に
- データベース単位で接続権限を決める
- スキーマ単位で所有者を決める
- テーブル単位で最小限の CRUD を付ける
1→2→3の順番で行うのが基本の管理方法。
| レイヤ | 制御内容 | 典型的な使い方 |
|---|---|---|
| データベース | 接続できるか | アプリごとに DB を分ける |
| スキーマ | 所有権 | アプリごとに専用スキーマ |
| テーブル | SELECT/INSERT/UPDATE/DELETE | 必要最小限 |
6. スキーマとテーブルの確認コマンド(psql)
スキーマやテーブルを確認したい時のコマンド。
スキーマ一覧
\dn
テーブル一覧(全スキーマ)
\dt *.*
特定スキーマのテーブル一覧
\dt sales.*
まとめ
- Database:最上位の入れ物(完全に独立)
- Schema:DB内のフォルダ/名前空間(整理と権限管理に便利)
- デフォルトは設定されている。DBの名前空間のようなもの。
- Table:実データ
- search_path:どのスキーマを優先して探すかの設定
