2017-09-13 62 views
0

ユーザーとワークグループという2つのテーブルという単純な状況を考えてみましょう。外部キー循環参照ジレンマ

  1. ユーザーの電子メールアドレスは、ユーザーテーブルの主キーです。
  2. Workgroup_idは、WorkGroupテーブルの主キーです。
  3. ユーザーは複数のワークグループを作成できます。
  4. ユーザーは、わずか1つのワークグループに含めることができます。この特定のシナリオの下では

私はは、ワークグループを作成したユーザーを追跡する必要があります。私はすでにやっていること

  1. は、ユーザーが所属するワークグループかを知るために、ユーザーテーブルにworkgroup_idという名前の変数を持っています。これは、ワークグループテーブルのworkgroup_idへの外部キーです。
  2. ワークグループテーブルにuser_emailという名前の変数を設定して、どのユーザーがワークグループを作成したかを追跡します。これは、users表のuser_emailに対する外部キーです。

私はここに直面しています問題は、これは、ユーザーとワークグループテーブルの間循環参照につながるということです。プログラミングのどこでも循環参照は大きな問題ではありません。

どうすれば解決できますか?ここで欠けているより良いデザインパターンはありますか?

EDIT:かどうかについては 「循環参照がある大きななしなし」か、概念的にはないかもしれませんが、そこに実装が異なるデータベースで非普遍的であることから、彼らはまだ有効な問題が残っています。これはORMを使用している場合に悪化します.ORMを使用すると、データベースのORMサポートにより、使用できるデータベース設計の種類が制限されます。

+0

これはどのように循環しているのかわかりません。ワークグループを作成するユーザーとワークグループ内のユーザーは関連しません。識別できない関係と識別できない関係を調べることができます。https://stackoverflow.com/questions/762937/whats-the-difference-between-identifying-and-non-identifying-relationships – dragmosh

+1

@dragmoshその方法では、まだ鶏と卵の問題があります。作成者の電子メールが必要なため、最初のワークグループを作成することはできません。また、ワークグループIDが必要なため、最初のユーザーを作成することはできません。 – Barmar

+0

このような設計上の問題にはあまり差がないかもしれませんが、同じ製品ではないので、mysqlとsql serverの両方でタグ付けしたくないでしょう。 – Xedni

答えて

2

少なくとも1つの外部キーをNULLにする必要があります。これにより、外部キーをプレースホルダとして空のままにして、そのテーブルの最初の行を作成することができます。他の表に対応する行を作成した後、最初の行の外部キーを更新します。

これは永久条件としてOKであると判断することもできます。ユーザーを作成する前に最初のワークグループを自動的に作成すると、その最初のワークグループには実際に作成者がないため、NULLに設定することができます。

+0

ありがとうBarmar、それは実際には素晴らしい解決策です。しかし、外部キーは行の面ではなく、列ではないと思いますか(質問の文脈でのみ)この場合、ワークグループを作成するユーザーは、ワークグループ自体の前に常に存在します。ワークグループの追加と削除は問題ありません。構造体は依然として循環参照状態になりますか? –

+0

最初のユーザは、自分が所属するワークグループの前に作成する必要があるため、null可能なカラムは 'users.workgroup'でなければなりません。 – Barmar