2016-04-17 15 views
0

私は2つのテーブルを持っています。例を簡単にするために、lawnmowerlawnとしましょう。ここで循環依存を避ける方法

  • 芝刈り機は常に芝生を刈っています。
  • 複数の芝刈り機は同じ芝生を刈ることができます。
  • 芝生には、その芝生を担当している芝刈り機が1つしかありません。
  • しかし、芝刈り機は、同じ 時に3つの芝生を担当することができます。

直感的なソリューション:

  • は、芝刈り機のリファレンスに、循環依存関係を与える

  • レッツ芝生の参照に責任芝刈り機を刈りされた芝生をしてみましょう。これを避ける最良の解決策は何ですか?私は現在、芝生と芝刈り機への外部キーを持つテーブルresponsibleforを検討中です。しかしこれにより、複数の芝刈り機が同じ芝生に責任を持つことが可能になりました。

  • +0

    OOPの循環依存関係は、データベースには適用されません。あなたの直感的な解決策には何も問題はありません。 – reaanb

    +0

    直感的にもそれは不可能です。どちらももう一方がなければ存在できません。私は最初の芝生や芝刈り機を作ることができないでしょう。お互いが存在する必要があるからです。 – Treeline

    +1

    これはトランザクションの対象です。 – reaanb

    答えて

    1

    まず、接合表が必要です。これは基本的にn-m関係であるためです。このテーブルは芝刈り機と芝生ごとに1つの行を持ちます(私はそれをLawnmowerLawnsと呼びます)。今

    箇条書きを処理する:

    • 最初のものは、すべての芝刈り機のために、このテーブルの行を必要とします。これは、ほとんどのデータベースでトリガーを使用して処理できます。おそらく他の解決策もあります。
    • 2番目はジャンクション・テーブルによって処理されます。
    • 3番目は、各芝生の "芝生"芝刈り機を表すためにテーブルにフラグを付けることによって処理されます。これは、トリガーまたは他のメカニズムを介して実施することができます。
    • 4番目にトリガーが必要です(リレーションシップのカウントには通常トリガーが必要です)。
    +0

    私は正しい軌道のようです。違いは、私は、芝刈り機で草刈りをしている芝生への言及を維持しており、ジャンクションテーブルを使って責任を分かりました。ジャンクション・テーブルにそれを含めることに引数がありますか? – Treeline

    +1

    2つの異なる述語(「芝生の芝生」と「芝生の芝生は芝生を担当している」)を扱っているので、2つの別々の関係表をお勧めします。これにより、私たちは、PKかユニークなキーを使って関係のカーディナリティを実施することができます。 – reaanb