2017-11-03 13 views
0

私はこの問題を抱えていますが、plpgsqlを使ってPostgreSQL DBの機能を使うべきかどうか、あるいはPython/plpgsql(postgresql)またはpythonクラスで関数を作成する方が良いでしょうか?

私の上司はなぜ私がpythonではなくplpgsqlに関数を書いているのか尋ねました。なぜ彼がそれがより良いのかの信頼できる答えを与えることはできません。

私はそれをGoogleに持っており、これに関する情報は見つかりませんでした。 plpgsqlで関数を実行することについて想像できる唯一のことは、プログラミング言語を変更した場合、関数を呼び出して新しい言語で書き直さないことです。

これは、私がstackoverflowメンバの助けを借りて作成するplpgsqlの例です。私はPythonクラスに書き直すか、関数としてdb内に残して、単にPythonクラスから関数を呼び出しますか?

CREATE OR REPLACE FUNCTION createid(idslist varchar[], objecttype varchar) 
RETURNS TABLE(original_id varchar, new_id varchar) as 
$$ 
declare 
l_prefix text; 
BEGIN 
IF LOWER(objectType) = 'global' THEN 
    l_prefix := 'GID'; 
ELSE 
    l_prefix := 'ORG'; 
END IF; 
RETURN QUERY 
INSERT INTO idstable(original_id, new_id) 
select t.x, l_prefix||nextval('mapSquema.globalid')::TEXT 
from unnest(idslist) as t(x) 
returning * 
END; 
$$ LANGUAGE plpgsql; 
+2

良い質問です。しかし正解はありません。 Googleと "データベース対アプリケーションのビジネスロジック"一部の人々はそれが悪い習慣だと思う。しかし、私は完全に同意しない。それはトレードオフとアーキテクチャに関するものです。 – AlexM

+0

ありがとう、私はそれをGoogleにする方法を知らなかった。 –

答えて

2

ストアドプロシージャのいくつかの利点は、一般的にあります。

  • は、クライアント側にデータを移動する最小限に抑えることができる、
  • ネットワークトラフィックを削減することが可能である、
  • サーバー側のコードされます
  • データ処理部分とデータ表示部分の分解に役立ちます。
  • セキュリティで保護された定義機能を使用すると、ストアドプロシージャなしでセキュリティを不可能にすることができます。

これらの機能は面白くて、非常に高速でよくメンテナンスされたアプリケーションを開発するのに役立ちます。

+0

私はループについて正しいかどうかは分かりませんが、私が間違っていれば私を修正します。 plpgsqlで関数を作成すると、データベースに1回呼び出されますが、Pythonで関数を作成して配列をループすると、dbに「len(配列)」呼び出しが行われます。もしそうなら、plpgsqlの関数は良いかどうか? –

+0

あなたは何をするかによって異なります。ループの速度は同じですが、データフォーマットの変換、クライアント側のデータ処理に関連するネットワークオーバーヘッドがあります。ストアドプロシージャを使用すると削除されます。このオーバーヘッドはかなり重要です。ストアドプロシージャを使用するだけで、速度を10倍に増やす回数が増えます。 –

関連する問題