私の考え:
私は、コスト、スケーラビリティ、互換性など、さまざまな理由からストアド プロシージャを絶対に軽蔑しています。
コスト: 優れた MySQL サーバー 1 台のコストで、2 ~ 3 台の優れた軽量 Web アプリケーション サーバーを入手できます。
スケーラビリティ: 確かにクエリ結果をキャッシュすることはできますが、ストアド プロシージャを使用すると、キャッシュできる内容をより細かくする機会が失われます。また、アプリケーションが常に MySQL を使用することになります (ストアド プロシージャを書き直すためのお金を持っている人はいません)。 MySQL を別のものに?)
互換性: ある時点で list_foo_widgetsByUser() ストアド プロシージャがクライアント #123 のニーズに合わない可能性があります。list_foo_widgetByUser() の署名を変更するのは自殺行為です...そのため、新しい sproc cl123_list_foo_widgetByUser() を作成する必要があり、その方法は狂気または殺人 DBA につながります。
私の解決策:
アプリケーションのリポジトリからモデルを取り出し、外部リポジトリに配置します。すべてのアプリケーションには、外部リポジトリを指す models/Base サブディレクトリがあります。次に、baseFooWidget クラスをインスタンスまたはアプリケーション固有の子インスタンスとして返す GetModel("FooWidgets") のような単純なファクトリ メソッドを前に置きます。これにより、個々のアプリケーションが FooWidget のクラスを継承したり、Liquabase などのツールと組み合わせたりして、より大きな可変性の基盤を実現できます。
頭の後ろで「これは簡単すぎる」という声が聞こえます...何が欠けているのでしょうか?
参考文献: 私は、PHP Kohana フレームワークがこれらの線に沿って何かを行って、アプリケーション設計者が機能を追加して Kohana の基本ライブラリをラップできるようにすることを知っています.PHP がそれを行うことができれば、他の言語に問題があるとは思えません.