1

次のような状況があります。私のテーブルは次のとおりです。

表: CompanyEmployees

  • 従業員ID
  • 生年月日
  • 入社日

また、各従業員の売上情報も保存したいと考えています。私はこれを持っています:

表: 取引完了

  • ID
  • 従業員ID
  • ディール名
  • 取引金額

私の質問はこれです- DealsCompleted の ID 列を直接参照する "DealsCompletedID" と呼ばれる CompanyEmployees の列が必要ですか、それとも 2 つの従業員 ID 列の間に外部キーを作成するだけでよいのでしょうか? これは設計に不利になるか、または正規化を歪める可能性がありますか?

CompanyEmployees に余分な列を含めるべきかどうかについてのルールが何であるかは不明です。

EDIT 従業員ごとに、deal テーブルには 1 つの行しかないと仮定してください。

4

2 に答える 2

2

AFOREIGN KEYは、1 つのテーブルから親テーブル内の参照されている行を指している必要があります。通常、2 つのテーブルは相互に参照してはなりません (両方に外部キーが定義されています)。

は、 を指す表でFOREIGN KEY最も適切に定義されています。このように考えてみてください。テーブルには従業員に関する情報が格納されています。彼らが成約した取引は、実際には従業員に関する情報としてカウントされません。ただし、取引を完了した従業員は取引に関する情報の一部であるため、キーはそこに属します。DealsCompletedCompanyEmployees.EmployeeIDCompanyEmployees

DealsCompleted.EmployeeID持つことで、従業員と取引の間の適切な 1 対多の関係が可能になります。つまり、1 人の従業員が必要な数の関連行を持つことができDealsCompletedます。一方、テーブルにDealsCompleted列を含めると、従業員に関する行を複製する必要があり、正規化が中断されるか、1 つの列に複数の値が含まれますが、これも正しくありません。CompanyEmployeesDealCompletedID

上記の編集後の更新1 対 1 の関係 (従業員ごとに 1 つの取引) のみを計画している場合でも、その逆 (または両方の方法) ではなく、EmployeeIDを参照する方が適切です。...そして、必要に応じて 1 対多DealsCompletedに拡張できます。

于 2013-01-27T16:41:33.353 に答える
1

あなたが述べているように、関係が常に1対1であると仮定すると、答えはドメインモデル内の主要なエンティティが何であるかによって異なります。このデータベースの中核が取引に関するデータベースであり、従業員データが補助的なものである場合、取引テーブルに EmployeeId FK 列を追加します。たとえば、これが従業員に関するデータベースであり、取引が補助的なものである場合、取引テーブルの EmployeeId 列を削除し、従業員テーブルに DealId FK 列を追加します。

于 2013-01-27T16:57:36.670 に答える