[pgsql-jp: 39374] Re: ストアドファンクションの作成の考え方について
ITAGAKI Takahiro
itagaki.takahiro @ oss.ntt.co.jp
2008年 5月 2日 (金) 18:30:58 JST
gold canon <goldcanon @ hotmail.com> wrote:
> スキーマごとに構成している DB でのストアド作成についてお伺いします。
>
> 同じようなテーブル構成をもった複数のスキーマがあった場合、
> そこで使うストアド(スキーマが違うだけで同じ動きをする)を
> 作成する場合についてなのですが、
>
> 1.スキーマごとに同じストアドを登録する
> 2.引数でスキーマ名を渡すようにして public などにひとつだけ登録する
>
> とどちらがよいのでしょうか?
状況によるとは思いますが、1. が適している気がします。
PL/pgSQL を使う場合、2. の方式だと動的SQLを多用することになります。
ストアドに変更があった場合のメンテナンス性は 2. のほうが良いのですが、
コードの可視性が悪くなるため、その利点が霞んでしまう気がします。
一方、1. ならば、静的SQLが使えるので、ストアドの記述がスッキリします。
ただ、関数内にスキーマを明記しない限り、設定パラメータ search_path が
動作に影響を与えてしまいます。スキーマ名を明記するか、関数内で
SET LOCAL search_path したほうが安全です。この場合、各ストアドが完全に同じでは
なくなるので、各々のスキーマへインストールする際に、ストアドコード内の
スキーマ名の部分を書き換える仕組みが要るかもしれません。
また、そもそも、スキーマごとにテーブル分けず、全て1つのテーブルに
入れるほうが、「RDBMSらしい」気はします。
(スキーマ情報は、そのテーブルに which_schema 列を追加して対処。)
もちろん、パフォーマンスを考えるとスキーマで分けたままほうが良い
可能性もあり、どちらかが優れていると断言するのは難しいです。
------------------------------------------------------------
板垣貴裕 <itagaki.takahiro @ oss.ntt.co.jp>
pgsql-jp メーリングリストの案内