Frage

Ich versuche, eine Beziehung zu schaffen, wo jeder von vier verschiedenen Teilen enthalten sein kann, aber jede Sammlung der gleichen Teile soll so einzigartig behandelt werden.

Beispiel: Eine Zuweisung muss ein zugeordnetes Unternehmen haben, gegebenenfalls eine zugewiesene Position, Workgroup- und Programm haben. Eine Zuordnung kann nicht eine Arbeitsgruppe haben, ohne einen Standort.

Nehmen wir an, wir haben die Unternehmen A, B, C; Stellen X, Y, Z; Arbeitsgruppen I, J, K und Programme 1, 2, 3.

So gelten die Beziehungen könnten A - X - I - 1 A - Z - 2 DURCH C C - 3 B - Z - K

Aber ungültige Beziehungen würden A - K (Arbeitsgruppe ohne Ort) Y - K - 1 (Kein Unternehmen)

Also, meine Tabelle zu erstellen, die ich angelegt habe

companyID INT NOT NULL,
FOREIGN KEY companyKEY (companyID) REFERENCES company (companyID),
locationID INT,
FOREIGN KEY locationKEY (locationID) REFERENCES location (locationID),
workgroupID INT,
FOREIGN KEY workgroupKEY (workgroupID) REFERENCES workgroup (workgroupID),
programID INT,
FOREIGN KEY programKEY (programID) REFERENCES program (programID),
UNIQUE KEY companyLocationWorkgroupProgramKEY (companyID, locationID, workgroupID, programID)

Ich stelle dar, das alle meine Beziehungen neben der neccessity einer Zuweisung behandeln würde einen Ort zu haben, wenn es eine Arbeitsgruppe ist (was ich gerne programmatisch tun kann oder mit Trigger, glaube ich)

Allerdings, wenn ich dieses Schema zu testen, erlaubt es mir die folgenden ...

eingeben
INSERT INTO test VALUES (1, null, null, null), (1, null, null, null);

... ohne Beanstandung. Ich vermute, dass (1, null, null, null) nicht selbst gleich, weil Nullen enthalten sind. Wenn dies der Fall ist, ist es eine Möglichkeit, diese Beziehung umgehen kann?

Jede mögliche Hilfe würde geschätzt!

War es hilfreich?

Lösung

Dies ist eine Eigenschaft (wenn auch nicht das, was ich erwartet hatte, entweder).

Dieser Thread schlägt Ihren Schlüssel ein Primärschlüssel, um das Verhalten zu bekommen Sie erwarten:

  

Dies ist ein Merkmal - ein NULL-Wert ist ein   undefinierter Wert, also zwei NULL   Werte sind nicht das gleiche. Kann ein   wenig verwirrend, aber sinnvoll, wenn   Sie denken darüber nach.

     

Ein eindeutiger Index hat sicherzustellen, dass   Nicht-NULL-Werte sind einzigartig; du könntest   angeben, dass die Spalte nicht akzeptieren   NULL-Werte.

Andere Tipps

Der einzige Weg, ich Handhabung dies ohne zusätzliche Trigger denken kann / Programmierung eine einzelne „Keine des oben genannten“ Wertes in jedem der referenzierten Tabellen zu haben wäre, so dass Ihr Test wie

aussehen würde
INSERT INTO test VALUES (1, NO_LOCATION, NO_WORKGROUP, NO_PROGRAM),
                        (1, NO_LOCATION, NO_WORKGROUP, NO_PROGRAM)

Wenn die NO_* Identifikatoren die richtige Art / Länge für Ihre ID-Spalten sind. Dies würde dann scheitern, wie man es erwarten würde.

In MySQL NULL! = NULL, oder irgendetwas. So ist das, was die UNIQUE funktioniert nicht. Sie sollten einen anderen Standardwert für Rohlinge verwenden, wie Null

Ich denke, es ist wichtig zu beachten, dass es eine richtige Art und Weise ist es, Wert für NULL interpretiert und behandelt werden, und das Verhalten des OP ausgestellt ist genau das, was beabsichtigt ist. Sie können dieses Verhalten außer Acht lassen, und Sie können Ihre Abfrage wie du ohne Einwand von mir willst behandeln, aber es könnte auch auf „Übernehmen“ eine Antwort sein, die irgendeine Form von Best Practices beschrieben, sondern als eine Nicht-Standard persönliche Präferenz.

Oder, wenn Sie nicht mit dem Konsens Best Practice einverstanden sind, können Sie einfach nicht akzeptieren keine Antwort.

Es ist kein Rennen, eine Antwort zu bekommen, so schnell wie möglich angenommen. Beratung und Zusammenarbeit sind auch Teil des Prozesses sein soll, denke ich.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top