postgresqlスキーマ

postgresqlにはスキーマと呼ばれるものがあります。(オラクルDBにもあるようです。)

[DB] ― [スキーマ] ― [テーブル] ― [カラム] ― [レコード]
(※すべて「1対多」の関係)

スキーマはDBとテーブルのあいだに存在する形になります。

「hoge_db」データベースに「public」スキーマと「hoge」スキーマが存在する場合の構成例
hoge_db(DB)
   ・public(スキーマ) ※1
       ・user_table(テーブル) ※2
       ・info_table(テーブル) ※2
   ・hoge(スキーマ)   ※1
       ・user_table(テーブル) ※3
       ・attention_table(テーブル)

(※1)1つのDBに対して複数のスキーマを持たせる事ができます。
(※2)1つのスキーマに対して複数のテーブルを持たせる事ができます。
(※3)スキーマ内に作成するテーブルは、別のスキーマ内にあるテーブルと同じ名前であっても問題ありません。

同じDB内で複数のテーブル環境を持つことができるため、テスト接続用のために新しいDBを作る必要が無いなど、
使い方によっては作業効率が上がる可能性があると思います。


スキーマの参照方法
スキーマへの接続はロール名によって振り分けられます。

hoge_db【postgres】
   ・public【postgres】
       ・user_table
       ・info_table
   ・hoge【hoge】
       ・user_table
       ・attention_table

※カッコ【】内はオーナーのロール名です。

上記の場合、hogeユーザで「hoge_db」へ接続してきた場合、接続先は「hogeスキーマとなります。
そのため、参照できるテーブルは

[user_table(hogeスキーマ内)]
[attention_table]

の二つ。

同様にpostgresユーザで「hoge_db」へ接続してきた場合は「public」スキーマへの接続となり、

[user_table(publicスキーマ内)]
[info_table]

の二つのテーブルが参照できます。

ここで気になるのが、DBへの接続権限があって、ロール名と同名のスキーマが存在しないロールで接続した場合。
postgresにログインして下記コマンドを実行すると接続方法が確認できます。

postgres=# SHOW search_path;
  search_path
----------------
 "$user",public

postgresqlでは、接続したDB内にロール名と同名のスキーマが存在しない場合、publicスキーマに接続される仕組みになっているようです。

詳しくはこちらのサイト->http://www.postgresql.jp/document/pg833doc/html/ddl-schemas.html

DBを作成した時点で自動的にpublicスキーマは作成されますので、スキーマを気にしていない場合publicを使用している事が多いと思います。

以前から使用していたmysqlにはスキーマは無かったため、今回の件でDBの概念が少々変りました。
mysqlでの「DB」は、postgresqlで言うところの「DB」と「スキーマ」を内包するイメージ。