2016-06-09 16 views
0

Zu Beginn haben wir das folgende Szenario (nicht genau so, aber aus vertraulichen Gründen werde ich nicht das Risiko eingehen, das Projekt explizit zu beschreiben), wo eine Person viele Hausadressen haben kann und natürlich ein Adresse gehört höchstens einer Person. Dies ist so ziemlich eine Eins-zu-viele-Beziehung, wo es zwei Tabellen gibt (Person und Adressen), wobei die zweite einen FK enthält, der den Besitzer referenziert. Aber leider wurde mir gesagt, dass mein System Benutzern auch erlauben sollte, Adressen zuerst einzugeben, also ein FK, der noch nicht in der Personen-Tabelle existiert. Ich kam zu dem Schluss, dass ich diese Einschränkung einfach fallen lassen muss. Machst du was es ist eine gemeinsame Sache zu tun? Darüber hinaus dachte ich, Konsistenz auch ohne FK (explizit erklärt) zu erhalten, wenn jemand die Person ID aktualisiert, da ich nicht möchte, dass der Benutzer es in beiden Tabellen tut, ist es möglich, einen Trigger zu erstellen (ich benutze Mysql-Server) Wird die zweite Tabelle automatisch aktualisiert (wenn diese Person eine Adresse hat)? Wenn ja, irgendeinen Hinweis darauf, wie man das schreibt (ich bin nicht vertraut mit Triggern)Eins-zu-viele-Beziehung

+0

Scheint einfach ... Sie hatten eine Einschränkung - dann wurde eine Anforderung gegeben, die diese Einschränkung bricht. Willkommen in einer Welt, in der du diese Einschränkung nicht mehr hast. – Hogan

Antwort

1

Sie können die 1: N-Beziehung pflegen, indem Sie die Zwischentabelle erstellen, die normalerweise mit M: N-Beziehungen verknüpft ist, aber eine Eindeutigkeitsbedingung hinzufügt auf dem Adressverweisfeld; alternativ können Sie den Verweis der Adresse auf eine Person, die als NULL-Wert definiert werden kann, einfach machen und sie so zu einer optionalen Referenz machen.


[Bearbeiten]

Scripts von MySQL-Dump wie ihr Inhalt mit etwas wickeln:

SET @[email protected]@FOREIGN_KEY_CHECKS; 
SET FOREIGN_KEY_CHECKS=0; 
.... 
SET [email protected]_FOREIGN_KEY_CHECKS; 

Wie Sie wahrscheinlich Fremdschlüsselprüfungen erraten kann, stellt sich vorübergehend ausgeschaltet voneinander abhängig Einfügen von Daten zu ermöglichen, außer Betrieb. Sie sollten sich jedoch der Vertrauenswürdigkeit der Importdaten sicher sein, da ich glaube, dass die Daten beim erneuten Einschalten nicht überprüft werden (so dass Daten, die FK-Einschränkungen verletzen, weiterhin bestehen bleiben können).

Wenn Sie die Fähigkeit benötigen, "address" vor "person" mit vom Benutzer eingegebenen Daten hinzuzufügen, dann sind Sie wieder in der ursprünglichen Situation, optionale Schlüssel oder eine andere Tabelle zu benötigen; oder einfach die "Adress" -Info nicht speichern (sondern stattdessen lokal im Dateneingabe-Programm halten), bis die "Person" -Info ausreichend/vollständig ist.

+0

Danke für die Antwort! So verstehe ich (und es ist eine großartige Idee), dass wir eine Join-Tabelle (mit eindeutiger Adresse) haben können. Aber nehmen wir an, dass wir eine neue Adresse haben (alles was wir neu haben ist die ID der Person, die mit dieser Adresse verbunden ist), fügen wir zuerst in Address Table ein und wenn wir weitergehen, fügen wir die PersonID und Address ID in die Join Tabelle ein. lch bekomme eine Fehlermeldung richtig? Weil die PersonID noch nicht in der Personentabelle existiert. Oder habe ich etwas falsch verstanden? – Bobby

+0

Sie verschieben nur Einfügen in die "Join" -Tabelle, bis Sie eine Person haben. – Uueerdo

+0

Ok, aber wie schlimm ist es, wenn ich es in einer 1: N Beziehung halte (ohne FK)? weil es eine Menge Daten ist, die ich in die Datenbank importieren werde, und diese Lösung scheint ein wenig kompliziert zu warten. – Bobby