2016-04-17 17 views
0

Ich habe zwei Tabellen; um das Beispiel einfach zu machen, nennen wir sie lawnmower und lawn.So vermeiden Sie zirkuläre Abhängigkeit

  • Der Rasenmäher mäht immer einen Rasen.
  • Mehrere Rasenmäher können den gleichen Rasen mähen.
  • Ein Rasen hat einen einzigen Rasenmäher, der für diesen Rasen verantwortlich ist.
  • Ein Rasenmäher kann jedoch für 3 Rasen gleichzeitig Zeit verantwortlich sein.

Die intuitive Lösung:

  • Rasenmäher Referenz Lassen Sie den Rasen es
  • Let Rasen Referenz der verantwortliche Rasenmäher

Daraus ergibt sich eine zirkuläre Abhängigkeit mäht. Was ist die beste Lösung, um dies zu vermeiden? Ich überlege gerade einen responsiblefor Tisch mit Fremdschlüsseln zu einem Rasen und einem Rasenmäher. Dies ermöglicht jedoch mehreren Rasenmähern, für den gleichen Rasen verantwortlich zu sein, was vorher nicht möglich war.

+0

OOP-Probleme mit zirkulären Abhängigkeiten gelten nicht für Datenbanken. Es ist nichts falsch mit Ihrer intuitiven Lösung. – reaanb

+0

Intuitiv wäre es auch unmöglich. Entweder kann nicht ohne das andere existieren. Ich wäre nie in der Lage, meinen ersten Rasenmäher oder Rasenmäher zu schaffen, weil sie sich gegenseitig brauchen. – Treeline

+1

Dafür gibt es Transaktionen. – reaanb

Antwort

1

Zuerst möchten Sie eine Junction-Tabelle, weil dies grundsätzlich eine n-m-Beziehung ist. Dieser Tisch hätte eine Reihe pro Rasenmäher und Rasen (ich würde es LawnmowerLawns oder so nennen).

  • Die erste erfordert eine Zeile in dieser Tabelle für jeden Rasenmäher:

    nun die folgenden Punkte zu behandeln. Dies kann mit einem Trigger in den meisten Datenbanken gehandhabt werden. Es gibt wahrscheinlich auch andere Lösungen.

  • Die zweite wird von der Junction-Tabelle behandelt.
  • Die dritte wird durch eine Flagge in der Tabelle behandelt, um den "primären" Rasenmäher für jeden Rasen darzustellen. Dies kann über einen Trigger oder andere Mechanismen erzwungen werden.
  • Die vierte erfordert einen Trigger (zählt auf eine Beziehung in der Regel erfordern Trigger).
+0

Klingt, als ob ich auf dem richtigen Weg bin. Der einzige Unterschied ist, dass ich den Bezug zu dem Rasenmäher, der mit dem Rasenmäher gemäht wurde, beibehalten habe, indem ich nur die Abzweigungstabelle verwendet habe, um die Verantwortung zu erfassen. Gibt es Argumente dafür, es in die Junction-Tabelle aufzunehmen? – Treeline

+1

Da wir es mit zwei verschiedenen Prädikaten zu tun haben ("Rasenmäher mäht Rasen" und "Rasenmäher ist verantwortlich für Rasen"), würde ich zwei separate Beziehungstabellen empfehlen. Dadurch können wir die PK oder einen eindeutigen Schlüssel verwenden, um die Beziehungskardinalitäten zu erzwingen. – reaanb

Verwandte Themen