2009-03-01 16 views
18

可能性の重複:私は大規模なデータベースは約4 GBのデータとMS SQL Serverを使用
What’s wrong with foreign keys?外部キーを使用する必要がありますか?

なぜ私は外部キーを使用すべきかウェブを検索します。 私はテーブルを結合するために使用されたキーのみを索引付けしました。 パフォーマンスはすべて問題なく、dataintegretyは問題ありません。

外部キーを使用する必要がありますか?外部キーを使用するとさらにパフォーマンスが向上しますか?

答えて

5

外部キーは、主にデータベースの整合性を強制するためのツールであり、実行速度とは無関係です。

インデックスデザインを既に最適化している場合は、これらのインデックスが少なくとも一意でないインデックスとして既にインストールされている可能性があります。だから、私は外部キーをインストールするだけでパフォーマンスの変化は期待できません(インデックスは必ずしも必要ではありません)。

私はあなたのデザインの最適化に関してあなたの満足感を疑っています。あなたはまだこの概念を釘付けにしていません。

「外部キー」のドキュメントを読んで、完全性を徹底するために何をするのかを理解することが重要です(それについて知っておく価値があります)。

+1

とを無効にすることができ、「実行速度とは無関係の」(私はあなたが知っている知っているが、トゥアンはないかもしれません) – SquareCog

+0

Thxを挿入するための完全に正確ではありません - 私は少し答えを記入し、同じ場所に終わるはずのやり方で。 – dkretz

+0

挿入に関する良い議論。私は構造をよく見ています。私はintegretyは問題ではないと述べた。私は生のスピードが必要です。 –

13

外部キーはパフォーマンスを実際に向上させるものではありませんが、実際にすべての書き込み操作で小さなパフォーマンス上のペナルティが発生し、制約が確実に満たされます。

これらを使用する理由は、破壊的な書き込み操作を防ぐためです。あなたがそれらを持っていない場合、バグのコード、または悪いSQLステートメントはそこにあると予想される行を削除することができます。

1

外部キーを使用すると、データの整合性が向上し、パフォーマンスが向上し、削除/挿入/更新時の処理速度がやや低下します。
私の最後の会社では、BLの変更をBLに簡単に(何億ものレコードを考える)行うので、BLに完全性/接続を維持することに決めました。小さなアプリケーションをお持ちの場合は、データレイヤー(db)でそれをしない理由はありません

+0

BLは何を表していますか? – usefulBee

+1

ビジネスレイヤー、データレイヤーはdbと直接通信するコードを処理します。 BLはそのデータを受け取り、そのデータを使用してビジネスルールを実装し、それをUIに送信します。 multy tieredソフトウェアを見るのはやや古い方法です。今日我々は3つ以上の層/層を持っており、我々はこれを追加するために広く分散されたシステムを持っています。 –

+0

「BLに完全性/接続性を保つことを決めました」と言って、Code Firstアプローチを指しているのでしょうか? – usefulBee

4

SquareCogが以前にリンクしていたという古い質問には触れられていませんでしたデータのクリーンアップ、バッチ更新、テストデータの生成、または通常の一連の処理をバイパスする任意のタイプの操作を実行します。しかし、このようなことをする前に、いつでも外部キーの制約を解除してから、後でそれらを再作成することができます(データベースオブジェクトを適切にスクリプト化した場合、余分な作業はほとんどありません)。

私は以前は怠け者でしたが、外来キーの制約に応じて周りに来ました。データベース間の関係のように、それらを持つことができない状況がまだあります。

3

外部キーがあなたのシステムにもたらす特徴/制約がありますが、今まで触れられていません。それはコミット/トランザクションロジックです(これは私がとにかく呼び出すものです)。外部キーを有効にすると、影響を受けるすべてのテーブル内の更新用のすべての行が、コミットが機能するために必要です(外部キー制約が違反されたというSQLエラーは発生しません)。

コミット/トランザクションを使用して動作し、「高速かつ緩やかに再生する」コード本体がある場合。その後、いくつかの改善のために、スキーマ内でFKのものを操作することができます。

また、少なくとも、Oracleは制約を無効にできます(削除/削除のみではありません)。したがって、あなたはそれらを簡単にオン/オフに切り替えることができます。制約のオーバーヘッドをかけずにバルク操作を行う場合や、制約に失敗する中間状態のデータに対して「手術」を行う場合に便利です。

+0

これらの両方が私が投稿したリンクに記載されていますが、私はとにかくあなたに投票します。 「コミット/トランザクションロジック」は、公式にはACID保証と呼ばれます(「C」は、トランザクション終了後もデータが宣言された制約と一貫しているため、一貫性があります)。 – SquareCog

1

外部キーを使用すると、データベースをきれいに保つことができます。データベースをカスケードすることができます。

9

今日は完全性は問題ではないかもしれませんが、それは明日または2週間後に問題になる正確な態度です。 MySQLでは

4

あなたが外部キーのSET FOREIGN_KEY_CHECKS=0

関連する問題