[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 メーリングリストの案内