2

私は循環参照でリンクされた4つのテーブルを持っています-私はこれが悪いと言われたことを大学から覚えていますが、例外があります...私はこれがそれらの1つであることを望んでいます:)

私のデータベースには4つのテーブルが含まれています。Teachers、classes、subjectsおよびteachers_classes。

以下は私の関係を要約したものです。

  • 先生は多くのクラスを持つことができます
  • クラスには多くの教師を含めることができます(したがって、teachers_classesはここで多対多を排除します)。
  • クラスには多くの科目を含めることができます
  • サブジェクトは1つのクラスしか持てません
  • 教師は多くの科目を持つことができます

これを視覚化できる場合、私のERDは正方形(または円)のように見えます...私はすでに単純なアプリを作成しており、他の誰かからこの問題を確認するように促されました。誰かがこれは例外であり、その理由を教えてください。私がこれについて教えられたことのどれも思い出せませんが、私のアプリケーションは私がやりたいことに対して完全にうまく機能しているようです!

4

1 に答える 1

2

循環参照は、いくつかの理由で悪い場合があります。

  1. 関係が存在する必要がある場合(つまり、ビジネス要件と技術要件の両方の観点から、教師にはクラスが必要であり、クラスには教師が必要です)、鶏が先か卵が先かというシナリオに遭遇します。クラスなしで教師を追加したり、教師なしでクラスを追加したりすることはできません。
  2. 階層の「トップ」に何があるのか​​を理解するのが難しくなります(正直なところ、「トップ」がないため)

クラスのない教師やクラスのない科目ができると仮定すると、その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)

したがって、技術的な観点からは、真の循環依存関係はありません。

于 2010-04-29T14:07:22.680 に答える