関係に問題はないと思います。代わりに問題は、各テーブルにサロゲートキー(ID)を使用することにより、結果のデータベースが、ある会社の部門と別の会社の部門の労働者の挿入を防ぐことができないことだと思います。これを理解する良い方法は、ER Diagrammingツールを使用してスキーマを視覚化することです。無料でダウンロードできるOracle Data Modelerツールを使用します。
ER図
現状では、2つの会社、たとえばIBM
とを持つことができますMicrosoft
。 部署IBM
を持つことができSoftware Development
、MicrosoftはDesktop Software
部署を持つことができます。IBMはSoftware Engineer
分類を持つことができ、MicrosoftはSoftware Developer
分類を持つことができます。あなたがのために代理キーを持っているので、今、Department
そしてClassification
、事実Software Development
であるIBM
部門とDesktop Software
あるMicrosoft
部門は、将来の親子関係のために失われます。これもの場合Classification
です。したがって、それは偶然に割り当てることが容易であるHarlan Mills
が誰であるか、IBM
の従業員Software Development
の部門、分類がでSoftware Developer
ているですMicrosoft
分類!同様に、労働者には正しい分類と間違った部門が与えられる可能性があります!最初の例を示す図を次に示します。
1 IDはを表しIBM
、2 IDはを表しMicrosoft
ます。私は赤でハイライトされてきたシナリオHarlan Mills
とは、Bill Gates
その逆10部門200分類IDに関連付けられたIDとバイスにより可視化され、間違った部署に割り当てられているが。
解決するオプション
それで、彼が起こらないようにするオプションは何ですか?2つの即時オプションがあります。1つ目は、すべてのテーブルに代理キーを使用することでこの問題が存在することを認識し、それが発生しないことを確認するための追加のプログラミングを導入することです。これはアプリケーションで実行できますが、挿入と更新がアプリケーションの外部で発生する可能性がある場合は、依然として誤った関連付けが発生する可能性があります。より良いアプローチは、従業員の挿入と更新で起動するトリガーを作成して、割り当てられた部門が割り当てられた分類と同じ会社のものであることを確認し、そうでない場合は挿入または更新を失敗させることです。
2番目のオプションは、すべてのテーブルに代理キーを使用しないことです。代わりに、Company
基本キーであり、親を持たないテーブルに対してのみ代理キーを使用してから、子テーブルとの識別関係を作成します。そして、テーブル、今のPK持ってそれらを区別するために、プラスシーケンス番号や名前を。その後、から関係とにはまたになるとのようにPK となり、プラス(私は、この例では、シーケンス番号を使用しています)、プラス。結果はテーブルにのみあります。今では割り当てることは不可能ですDepartment
Classification
Department
Classification
Company Id
Department
Classification
Worker
identifying
Worker
Company Id
Department Number
Classification Number
one
Company Id
Worker
Worker
a Department
に1つとCompany
a Classification
に別にCompany
。
なぜこれが不可能なのですか?スキーマは、間の参照整合性実装しているためそれは不可能であるWorker
とDepartment
とをClassification
。試みが挿入するように作られている場合Worker
のためにDepartment
一つにCompany
し、かつClassification
、他の、対応する親テーブルに存在しない組み合わせは、参照整合性違反と挿入しません作業をトリガします。
次に、2番目のオプションの実装の更新された図を示します。
優先オプション
2つのオプションのうち、2番目の理由-識別関係とカスケードキーを使用する-を絶対に好む。まず、このオプションは、追加のプログラミングなしで目的のルールを実現します。トリガーの開発は簡単ではありません。コーディング、テスト、および保守する必要があります。パフォーマンスに影響を与えないようにトリガーロジックを最適化することも簡単ではありません。データベース専門家向けの応用数学の本は、そのようなソリューションの複雑さに関する多くの詳細を提供します。第二に、ルールは、DepartmentとClassificationがのコンテキスト外に存在できないことを意味するCompany
ため、スキーマは実際の世界をより正確に反映するようになりました。
これは、すべてのテーブルにサロゲートキーが必要であると単純に仮定するのが悪い考えである理由を正確に示しているため、素晴らしい質問です。 Fabian Pascalには、このトピックに関する優れたブログ投稿があり、代理キーはデータの整合性の観点から悪い考えであるだけでなく、一部の検索が遅くなることもあることを示しています。物理レベルでは、キーが適切にカスケードされていれば不要な結合が必要なためです。この質問が明らかにするもう1つの興味深いトピックは、データベースに挿入されたすべてのデータが現実世界に関して正確であることを保証できないことです。代わりに、挿入されたデータが宣言されたルールと一致することのみを保証できます。この場合、カスケードキーアプローチを使用して、DBMSがWorker
特定のa をCompany
割り当て、同じClassification
a Department
を割り当てる必要があるというルールに関してデータの一貫性を維持できるようにすることで、最善を尽くすことができますCompany
。しかし、現実の世界Microsoft
に部署Desktop Software
があり、データベースのユーザーが部署がSoftware Development
DBMSは何もできませんが、真の事実が与えられたと仮定します。