2009-08-08 9 views
0

私はすべてのデータアクセスがSprocs経由で行われなければならないという会社のポリシーを作りました。これには、選択、更新、削除、挿入が含まれます。私たちは彼らによって暴かれ始めています。私はそれを過大にしていますか?選択が実行され、結果がカスタムDALにダンプされます。SQL ViewsとSprocs

私はこれが神聖な戦争のような質問であると感じています。私はsprocsが単純な選択のために過度のものであるが、更新、挿入、および削除の必要性に腹を立てている。 sprocsの主張の1つはセキュリティです。特定のユーザーは、アプリの特定の部分にアクセスすることは想定されていません。ここで誰が実際にWebサイトのデータベースに複数のユーザーを作成していますか?手はない?

また、いくつかのテーブルについての統計情報を取得する必要があります。これは、UDFへの多数の呼び出しを伴う1つのクエリです。これらの統計値は分単位で変化します。私はビューまたはsprocを使用する必要がありますか?私はsprocに向かって学んでいます、とにかく毎回見直しが必要になるでしょう。これは正しい仮定ですか?

+0

ストアドプロシージャは、現在、一般的なプラクティスが可能な限り避ける理由を維持することは難しいです。 – Ray

+3

ストアドプロシージャは、さまざまなテクノロジを使用してデータベースにアクセスするさまざまな異なるクライアントよりも保守が非常に簡単です。あなたの会社が5年以上になると後は避けられません。 – Andomar

+0

Oracleは、ファンクションおよびプロシージャを論理的にグループ化するために使用されるパッケージをサポートしています。トレードオフは、細分化された(機能または手順)ベースでアクセスを許可する能力が不足していることです。 –

答えて

1

ストアドプロシージャに加えて、ビューへのアクセスを許可することもできます。ビューへのアクセスは引き続き制御できますが、多くのストアドプロシージャを1つのビューで置き換えることができます。

ストアドプロシージャを機能別にグループ化し、グループごとにプレフィックスを使用することもできます。 Like、cart_AddItem、またはuser_GetPreferences。これは遡及的に実装する作業の多くですが、始めるのが遅すぎることはありません。

複数のプログラムやウェブサイトからアクセスされるデータベースを管理している場合は、複雑な管理が可能な唯一の方法としてストアドプロシージャがあります。一方、それが単なるウェブサイトであれば、LINQのようなデータアクセス層は非常にうまくいくでしょう。

+1

私たちのサイトはすべて、他の何かがそれらにアクセスすることを想定して構築されています。私たちがウェブサイトを構築するのは珍しいことではなく、クライアントはスケジュールされたタスクのように、プロセスを実行するための何かを望んでいます。私は実際にコード生成プログラムにプレフィックス機能を追加しました。それはいくらか助けている。私はLINQにまだ飛び込んでいません。私は私のDALパターンの一部です。 – Darthg8r

2

これは私がジャークのように聞こえるようにするものですが、実際にはそうではありません。あなたの質問に対する私の答えは別の質問です。 「あなたは は、データベースがどのように機能するかを理解していない場合は、 開発政策をどのようなビジネスを定義しているのですか?」

あなたは「ビューはちょうどいつでも自分自身を再構築する必要があります」と言います。あなたは、ビューを持つコードがクエリされるたびに再コンパイルされると言っていますか?それは絶対に真実ではないからです(少なくともOracleとSQL Serverではそうです)。ビューの使用は、ストアドプロシージャよりも効率的なクエリを得るための柔軟性の高い方法です。オプティマイザは、使用方法によってビューを再最適化できるためです。一度実行すれば、クエリプランはキャッシュされ、再コンパイルする必要はありません。ポイントのケース:あなたは、このビューを作成します。

あなたは、あなたはすべての顧客のリストはジョン・スミスという名前たいことを決定:

SELECT c.CustomerID 
FROM myOrders 
WHERE c.LastName = 'Smith' AND c.FirstName = 'John'; 

それはビューなので、「受注」への参加を取得離れて最適化。ストアドプロシージャでこれをモジュール化しようとしましたが、できませんでした。あなたはおそらく目的のために別のsprocを作る必要があります。そしてもうすぐあなたはあなたが持っている問題に終わりますが、それはやや保守的なprocsのトンです。

なぜストアドプロシージャを使用していますか?あなたが解決しようとしている問題は何ですか?カプセル化?私は、SELECTの場合、UDFがより有用であると主張します。私はまた、中間層のLINQ型問合せがさらに柔軟性があると主張します。ストアドプロシージャを使用してパフォーマンスを最適化しようとしていますか?その場合は、実行するすべてのアドホッククエリが最適化されキャッシュされることを理解してください。SQL Server 2005+を使用している場合、パラメータを明示的に指定しなくても、クエリプランをパラメータ化してキャッシュすることさえ可能です。

ストアドプロシージャにはその場所がありますが、保守性、使用の柔軟性、およびパフォーマンスの面での欠点は、慎重に使用する必要があることを意味します。

+1

ストアドプロシージャによるデータアクセスは複雑さを管理する方法です。 DBAがデータベースを制御できるようにします。開発者を制限することがまさにポイントです。これは、「開発者の裾引きに対する包括的なポリシー」ではなく、開発者のデータベース品質の自由化に関するものです。長期的には、これは大きな効果を発揮します – Andomar

+0

これは、より現代的な方法と比べて、複雑さを管理する非常に悪い方法です。 1999年に、信頼できるORマッパーがなかったとき、これは本当だったかもしれません。もはやそれはありません。現在では、Hibernate、LINQ to SQL、Entity Framework(2.0)などがあります。彼らは重要なパフォーマンスのトレードオフを起こすことなく、すべてのCRUDデータアクセスパターンを簡単に処理します。 "データベースの管理を維持するDBA"はどうですか?すべてのデータ・アクセス・コードがDBAを経由して製品に組み込まれなければならない場合、ソフトウェアをリリースするまでどれくらいの時間がかかるか考えると悲鳴を上げる。 –

+0

私のデータアクセスコードはすべてDBAを経由しており、リリースサイクルは約15分です。ストアード・プロシージャー・レイヤーは、高い整合性データベースをもたらしました。当社のDBAは自信を持って管理しています。 – Andomar