PostgreSQLはひとつのデータベースに複数のスキーマを作れる。そして、スキーマには複数のテーブルを作れる。つまり次のような階層構造になる。
- データベース
- スキーマ
- テーブル
- テーブル
- テーブル
- スキーマ
- テーブル
- テーブル
- テーブル
- スキーマ
スキーマはプログラミングで言う名前空間のような用途としても使うことができる。従って、大規模なアプリケーションではモジュールやドメイン駆動設計で言う「コンテキスト」をスキーマに分割した構成も考えられる。
気になるのが、「スキーマを超えてトランザクションがはれるのか?」という点だ。結論としては可能。以降は再現手順を記す。また、再現コードはGitHubのリポジトリのsuin/postgres-demo-transaction-across-two-schemasから入手できるようにしてある。
再現手順
バージョン
- Postgres 9.6.4
テーブル、スキーマなどを作る
CREATE TABLE bar (name text NOT NULL);
CREATE SCHEMA foo;
CREATE TABLE foo.bar (name text NOT NULL);
トランザクションをはってみる
-- 普通にCOMMIT
BEGIN;
INSERT INTO bar (name) VALUES ('#1 add to public.bar');
INSERT INTO foo.bar (name) VALUES ('#1 add to foo.bar');
COMMIT;
-- 今度はロールバック
BEGIN;
INSERT INTO bar (name) VALUES ('#2 add to public.bar');
INSERT INTO foo.bar (name) VALUES ('#2 add to foo.bar');
ROLLBACK;
-- 登録されたレコードを確認する
SELECT * FROM bar UNION ALL SELECT * FROM foo.bar;
実行結果:
name
----------------------
#1 add to public.bar
#1 add to foo.bar
(2 rows)
まとめ
- Postgres 9.6.4ではスキーマを超えてトランザクションを効かすことが可能。