3

私の同僚は、クライアントの DBA がプロジェクトの Oracle DB スキーマのすべての外部キー制約を削除することを提案したと言いました。当初、私はその決定に同意しませんでした。私は DBA ではなく開発者です。そのため、決定の背後にはいくつかの理由がある可能性があることに後で気付きました。だから私はこの決定の長所と短所を得ようとしています.

プロジェクト情報:

  1. Hibernate パーシスタントを使用した Spring アプリケーション。
  2. オラクル 10g データベース
  3. SQLローダーまたはプレーンJDBCのみを使用するバッチジョブがあります。

これが私の長所と短所のリストです(間違っている場合は修正してください)

長所:

  1. アプリケーションの永続化は Hibernate によって管理されるため、外部キーのカスケードは必要ありません。適切なカスケード オプションを使用して Hibernate によって管理されます。

  2. Hibernate DELETE アクション (delete cascading オプションを含む) は、主キー レコードを削除する前に外部キー テーブル レコードを削除します (つまり、参照整合性の問題を回避するため)。この動作は、外部キーなしの場合、外部キーの場合、カスケード付きの外部キーの場合と同じです。ただし、外部キーを追加すると、Oracle の削除操作が不必要に遅くなります。

短所

  1. Hibernate は、オブジェクト間の関連付けと関連付け内のカスケード操作を管理するためのメカニズムを提供します。しかし、DB が持つ完全な参照整合性ソリューションを提供することは決してありません。

  2. SQL ローダーまたはプレーン JDBC のみを使用するバッチ ジョブには、参照整合性が必要です。

皆さん、これについてアドバイスが必要です。あなたの誰かが DBA である場合は、DBA 側の理由を教えてください。

ありがとうございました。

4

4 に答える 4

9

DBA からそのような提案を聞いたことがありません。アプリケーション開発者からは、はい、データベース管理者からではありません。それは信仰を乞食します。

Tom Kyte は何度も言っています (たとえばここで): アプリケーションは出入りしますが、データは永遠です。

私自身の経験では、20 年以上前の Oracle データベースに取り組んできました。Oracle 6 から始めて、何年にもわたって 10G または 11g に移行しましたが、同じデータです。しかし、トップに位置していたアプリケーションは? 最初は Forms 3.0 でしたが、一部は C++ に移行され、一部は Forms 6i で再構築され、一部は Application Express で再構築されました。もちろん、ADF も別の可能性です。またはおそらくSOAアーキテクチャ...

Oracle の DBMS としての役割を突然引き継ぐ現在のアプリケーション開発ツールの何が特別なのでしょうか?

于 2010-07-09T09:47:36.903 に答える
6

私は、参照整合性制約を削除することを決定したプロジェクトでデータベースに取り組んできました。

すべてのテーブル関係に関して孤立した行を検出するために、「QC スクリプト」を作成する必要がありました (孤立した行は、外部キー制約によって防止されていました)。

次に、(発生したかどうかではなく) 発生したときに、孤児を解決する方法に関するポリシーを用意する必要がありました。選択肢には以下が含まれます。

  • 孤立した行を削除します。
  • 孤立した行をアーカイブします。
  • 孤立した外部キ​​ー値を NULL に更新します。
  • 孤立した外部キ​​ー値を親テーブルの既存の値に更新します。
  • 異常と一緒に暮らす。孤児をレポートから除外するコードをさらに記述します。おそらく、すべてのテーブルに対するビューのセットでしょうか?

このデータベースの利害関係者との定期的な週次ミーティングをスケジュールして、QC スクリプト レポートを確認し、孤立した各行をどうするかを決定することができます。

データベースで実行される制約ほど確実に参照整合性を適用できるフレームワークはありません。真にアトミックな変更を提供し、一貫性を確保できるのはデータベースだけです。

于 2010-07-09T07:53:06.950 に答える
4

データベースの制約が保証されているため、状況によっては、追加の最適化が可能になります。

たとえば、ビューがあるとします

CREATE VIEW orders_vw AS
SELECT ord.order_id, ord.customer_id, lin.product_id
FROM orders ord JOIN order_lines lin on ord.order_id = lin.order_id

SELECT product_id FROM orders_vw WHERE order_id = :val 整合性が適用されると、データベースは order_lines の任意の order_id が親テーブルに 1 行あることを認識し、orders テーブルの値が実際には選択されていないため、注文にアクセスしないことで作業を節約できます。テーブル。制約がないと、データベースは order_lines のエントリに親があることを確認できないため、orders テーブルにアクセスして確認するという追加の作業を行う必要があります。

クエリ パターンによっては、制約を削除すると実際に DB のワークロードが増加する場合があります。

于 2010-07-09T22:45:16.607 に答える
-2

通常、外部キーの削除は、データベースのパフォーマンスの最適化から始まります。これは一種のトレードオフです。DBMSレベルで保証された整合性を販売し、それを自分で管理する必要があり(Hibernateではかなり簡単ですが、プレーンSQLでは非常に正確である必要があります)、クエリの外部キーチェックによりクエリのパフォーマンスが向上します。かなり高価です。

于 2010-07-09T07:21:17.510 に答える