2009-10-27 3 views
7

メリットがあります。しかし、 正式な構造化と正規化に限定されません。 のパフォーマンスまたはスケーラビリティの利点を提供する場合にのみ、それを実行します。SQL Serverの外部キー制約は、私たちは、私はいくつかのFK(外部キー) 制約を考慮する必要のあるデータベースを設計している

私はいくつかの面白い記事を読んで、実用的なメリットを求めています。ここではいくつかのリンクがあります:

http://www.mssqltips.com/tip.asp?tip=1296

私はFKのメリットについての詳細を知りたいと思った(別に正式な構造から、有名なは\更新をカスケード削除します)。

  • FKはデフォルトで「インデックス登録」されていないので、FKのインデックス作成時に考慮すべき点は何ですか?外部キーとしてマッピングするnull許容のフィールドを処理する方法を

  • - この許可されていますか?

  • は別にインデックスから、SQL-Serverのクエリ実行計画を最適化するには、このヘルプのでしょうか?

私はもっと知っていますが、私はこれについて話すのが好きです。私を案内してください。

答えて

9
  • 外部キーには、パフォーマンスやスケーラビリティの利点を提供しません。
  • 外部キーは参照整合性を強制します。親テーブルから誤って行を削除しようとすると、エラーが発生して実用的なメリットが得られます。
  • 外部キーの既定のインデックスは作成されません。親行を削除/更新するときに、子表の表スキャンを回避するため、外部キー列を索引付けする必要があります。
  • 外部キー列をNULL可能にし、NULLを挿入できます。
+0

私は数百万のレコードを持ついくつかのデータベースを扱ってきました。データベースとそのクローンの間でデータをインポートしてから、そのクローンをWebアプリケーション環境で使用することが多くなります。 私は、PKインデックスを自動的に保持することでデータアクセスのスピードアップに役立つことが分かっています。さて、この議論から、私がSQLクエリでJOINを使用している場合、私はFKを使用してインデックスを作成して、JOIN操作を効率的にすることができます。 –

+0

たとえば、テーブルOrgMaster(すべてのOrgレコードを含む)を持っていて、BookingMasterテーブル(すべての予約レコードが含まれています)を持っています。 OrgMaster.IdがBookingMaster.OrgIdとして参照されています。だから、OrgIdとIdの関係のためにFKを持っていて、両方のテーブル間のJOIN演算のパフォーマンスを向上させるために 'インデックス'をshudしました。正しく取得できましたか?
上記のすべては、余分なスペースと時間のオーバーヘッドを犠牲にしています(FKでテーブルにレコードを挿入中)。 –

+0

私は、あなたが私にポイントのリストを提供するようにお願いします。 - テーブルが数百万レコード増えているので、FK-indexは時間がかかりすぎますか? - その場合、「毎回」FKインデックスに行く価値はありますか? - 私はFKを適用しないか、それをインデックス化するか、どちらも実行しないでください。 - JOINや他の時間のかかる検索を高速化するために他のトリッキーな方法はありますか? –

6

主な利点は、あなたのバギーのクライアントコードが間違って何かをしようとすると、データベースが矛盾してしまうではないということです。外部キーは一種の「制約」なので、それらを使うべきです。

「機能的」な利点はありません。何も最適化されません。インデックスは自分で作成する必要があります。また、外部キーである列にNULL値を設定することもできます。

+1

バグの多いクライアントコードだけでなく、 「Buggy」ユーザとデータベース管理者は、SQLの更新コマンドを直接入力することで迅速な修正を行う際に間違いを犯すことが知られています。 –

4

FKの制約により、データの整合性が保たれます。それでおしまい。これが主な利点です。 FK制約はパフォーマンスの向上をもたらしません。

目的のDB構造で非正規化しない限り、FK制約を使用することをお勧めします。主な理由 - 一貫性。

1

述べたように、彼らはデータの整合性のためのものです。パフォーマンスの「損失」は、破損したデータを修正するために必要な時間だけ完全に消去されます。

ただし、間接的なパフォーマンス上の利点がある可能性があります。

少なくとも、SQL Serverの場合、FKの列はそれぞれのデータ型が同じでなければなりません。 FKがなければ、たとえばnvarcharの親とvarcharの子を持つことができます。2つのテーブルを結合すると、パフォーマンスを低下させる可能性のあるデータ型の変換が発生します。私はそれはそれは、データがすでに一定の基準を満たしている知っているので、オプティマイザは、テーブル間の追加のチェックを行う必要はありませんので、外部キーがパフォーマンスをを改善しないことが示されたネット上の少なくとも1つの例を読んだ

Example: different varchar lengths causing an issue

3

FKのために。申し訳ありませんが、私はリンクを持っていませんが、ブログはそれを証明するためのクエリプランの詳細な出力を与えました。

関連する問題