5

スキーマをそのように想像してみてください。 テーブル内の外部キーのショートカット

NOTE TABLE:   NoteID, Note, DetailedTaskID, ..... 

DETAILED TASK TABLE: DetailedTaskID, WorkOrderID, ..... 

WORKORDER TABLE:  WorkOrderID, ProjectID, ..... 

PROJECT TABLE:   ProjectID, ..... 

は今、このスキーマに私が参加するのかなりの数で終わる特定のプロジェクトに関連付けられているすべてのノートを取得したいと言うことができます。

IE: Note JOIN DetailedTask JOIN WorkOrder JOIN Project 

(今までであれば)、それは適切な(この場合はPROJECTID)テーブルの「ショートカット」列を追加するときに私の質問は、このですか?だから、基本的にはこれにメモテーブルを変更

:たNoteID、ノート、DetailedTaskID、PROJECTID

答えて

7

短い答え:決して、これまで。

長い答え:あなたはJOINの性能が(まれに真である)受け入れられないと判断しました

  1. :のみ。

  2. あなたは本当に危険性の低い代替品を本当に使い果たしました。

  3. あなたが同期して冗長化、デ正規化された情報を維持するのに関与して余分な作業を吸収するのに喜んでいるあなたが、それは、あなたのデータベースが不正な結果を返すようにするために技術的に可能になるという事実を受け入れることを喜んでいる

  4. あなたが物事を同期させ続けるのに失敗した場合。

+0

どうすれば確認できますか? 「あまり危険ではない」と言えば、バグによって1つの外部キーが1つのプロジェクトを指し、別の外部キーが別のプロジェクトを指し示すシナリオを意味すると見なします。 –

+0

ちょうどそうです。この場合、あなたのコード(または後で追加された他人のコード)の見落としによって、あるテーブルの外部キーが更新される可能性があります。または、2番目の表の行の正規化されていない外部キーの値の一部のみを更新することができます。または、2番目のテーブルの行数が多すぎると更新される可能性があります。正規化された表から、時には正規化されていない表から外部キー値を取得している場合は、すぐに、または一貫してこれらのエラーを表示しないことがあります。それはできますが、最初にそれを行う必要が本当にあることを確認してください。 –

+0

おかげさまでありがとうございます... –

1

あなたが何を言ってるのかは、外部キー関係と呼ばれています。それはData Normalizationの基礎です。手短に言えば、ノート(NoteID)がプロジェクトに属する場合、外部キー関係(ProjectID)をノートテーブルに追加します。あなたはこのリレーショナルデータを照会することができるよう

これを行うことの利点は、次のように:(それはプロジェクトの一部である場合)

select 
    Note.*, 
    Project.* 
from Note 
left join Project 
on Note.ProjectId = Project.ProjectId 

そのクエリは、そのすべてのノートを得て、プロジェクトデータですそれに関連する。