schemaをもっと使っても良いと思う

DBならスキーマって機能が普通あるもんだと思いますが、実務上あんまり使われない機能の一つです…よね。幾つかシステムを見てきたけど、使ってるものはなかった。でも実は便利かも、というお話。

使い方

"スキーマ名.テーブル名"が認識子となる。CRUD文や外部キー定義等も、すべて"スキーマ名.テーブル名"で行う。もちろん、異なるスキーマ同士での外部キー定義やテーブル結合、ビュー定義も可能。

--スキーマ定義
CREATE SCHEMA hoge;

--テーブル定義
CREATE TABLE hoge.test_of_hoge
(
  id serial NOT NULL,
  name text NOT NULL,
  value integer NOT NULL,
  CONSTRAINT test_of_hoge_pk PRIMARY KEY (id)
) 

良さそうなところ

名前空間の分離ができるのが良い。サブシステム間やレガシーシステム等他システムとの共存の場合の制約が少なくなる。テーブル名定義から、無駄な接頭語を追放できる。他システムとの連携も、ある程度まとめられるようならスキーマを分けてもよさそう。名前空間の分離=責任範囲の分離と出来れば、マネージメント上もとても良い。

逆に、アクセス制限には使わないだろうと思う。実運用アプリケーションだと、クライアントからDBサーバへの直接アクセスさせるような設計はほとんどないか、そもそもとっても限られた人しか接続できないようにしてるから、ユーザによるアクセス制限自体が無意味か、どちらか。