循環参照は、いくつかの理由で悪い場合があります。
- 関係が存在する必要がある場合(つまり、ビジネス要件と技術要件の両方の観点から、教師にはクラスが必要であり、クラスには教師が必要です)、鶏が先か卵が先かというシナリオに遭遇します。クラスなしで教師を追加したり、教師なしでクラスを追加したりすることはできません。
- 階層の「トップ」に何があるのかを理解するのが難しくなります(正直なところ、「トップ」がないため)
クラスのない教師やクラスのない科目ができると仮定すると、その2つのうちの1つが「トップ」になるように聞こえます(ビジネスの観点からは、科目になると思います)。
あなたが持っているものが機能している場合、私はデザインに問題は見られず、またそれをデザインする別の方法も見ていません。
コメント後に編集
片側依存関係に問題はありません(これは、単純なolのnull許容でない外部キーです)。
あなたのコメントに基づいて、私も何かを指摘する必要があると思います。循環依存への反対は技術的であり、論理的ではありません。クラスのない教師や教師のいないクラスはあり得ないと企業が言っている場合、それは問題ありません。そのようにデータをモデル化することはできません。そうしないと、何も追加できなくなります。これらのオブジェクトのどれ(クラスまたは教師)が分離して存在できるかを定義する必要があります(ビジネスの観点ではなく、技術的な観点から)。
教師とクラスの間にM:Mの関係があるという事実によって、いくらか節約されます。これにより、両方が分離して存在できるようになります(接続は参加者テーブルではなくリンクテーブルで行われるため)彼ら自身。
このため、真の循環依存関係はありません。ビジネスロジックは循環的ですが、動作を完全に制御できるため、問題ありません。レイアウトは次のようになります。
Teacher <----- TeacherClass -----> Class
^ ^
| |
| |
TeacherSubject --------------------> Subject
(教師が複数の科目を持つことができる場合)
またはこれ:
Teacher <----- TeacherClass -----> Class
| ^
| |
| |
\----------------------------> Subject
(教師が1つの科目しか持てない場合)
またはこれ:
Teacher <----- TeacherClass -----> Class
^ ^
| |
| |
\----------------------------- Subject
(サブジェクトが教師を1人だけ持つことができる場合)
最初のケースでは、とはどちらも他のものを指していないため、両方ともTeacher
トップClass
レベルのエンティティです(リンクテーブルがこれを実現します)。2つ目Class
は、トップレベルのエンティティのみです。
パスのどこかにトップレベルのエンティティがある限り、問題はありません。最初に、次の順序でレコードを追加できます。
Teacher -> Class -> (TeacherClass -> Subject) -> TeacherSubject
TeacherClass -> Subject
(任意の順序で追加できるため、括弧で囲みました)
2番目では、次の順序でそれらを追加できます。
Class -> Subject -> Teacher -> TeacherClass
3番目では、次の順序で追加できます。
Class -> Teacher -> (TeacherClass -> Subject)
したがって、技術的な観点からは、真の循環依存関係はありません。