5

Ich habe speichern diese Informationen in einer Datenbankwie eheliche Beziehung in einer Datenbank

Person zu retten -> verheiratet ist -> Person

Wo soll ich diese Informationen speichern? Welches Designmuster sollte ich hier anwenden?

Vielen Dank!

+18

Ich glaube nicht, dass Sie sich auf eine Datenbank verlassen können, um Ihre Ehe zu speichern; D – glenatron

+0

2 Tabellen. Eine Eins-zu-eins-Beziehung mit einer Zuordnungstabelle. –

+1

"Glenatron meine Damen und Herren! Er wird das ganze Wochenende hier sein, vergessen Sie nicht, Ihren Kellnern und Kellnerinnen Trinkgeld zu geben!" –

Antwort

4

Wenn Sie kann nur eine Person maried werden: 1: 1

------------- 
- Person - 
------------- 
id (key) 
maried_to_id (foreign key) 

Wenn Sie mehr als eine Person maried werden können oder wollen Spur früheren mariages zu halten, n: n

------------- 
- Person - 
------------- 
person_id (key) 

------------- 
- Mariage - 
------------- 
first_person_id (foreign key) 
second_person_id (foreign key) 
start_date 
end_date 

(auch first_person_id + second_person_id + Datum bilden einen eindeutigen Schlüssel für mariage. Sie könnten das Datum weglassen, aber dann würde nicht remariages aufgespürt werden)

+0

Das Feld maried_to_id sollte in beiden Personen abgeschlossen sein? Es gibt wiederholte Informationen, aber ich kann es nicht in einem von ihnen leer lassen, weil es nicht wahr wäre. –

+0

@mauro: Ja, es sollte für beide gefüllt werden. Natürlich brauchst du Logik, um sicherzustellen, dass diese Bedingung verifiziert wird (dh lösche niemanden, wenn die Person verheiratet ist, marschiere nicht zu nicht existierenden Personen ...) – marcgg

+1

Du hast EndDate vergessen! -) Und, ein bisschen konservativ, ich würde es genauer für den Namen machen: HusbandId, SpouseId. Auf diese Weise erzwingen Sie den Einstieg 1 Weg. Aber es würde nicht mit der homosexuellen Ehe funktionieren. –

0

ich würde empfehlen, Struktur Following Sagen wir, Tabellenname ist Person.

  1. PersonId (int, Key)
  2. MarriedTo (int, nullable)

.....

Keine Notwendigkeit, Fremdschlüssel Beziehung Schiff zu erstellen.

+1

Fremdschlüssel sollten eigentlich ** immer ** unter Verwendung einer FK-Beziehung erzwungen werden – Jamiec

+0

Beachten Sie, dass der Status dupliziert ist, wie a.MarriedTo (b) auch b.MarriedTo (a) bedeuten sollte. – Piskvor

+0

ja - die Komplikation von verheiratet sein in mehreren Reihen gleich sein ist ein Normalisierungsproblem ... – Randy

0

Sie könnten es mit einer Spalte "Ehepartner" in der Tabelle "Person" tun, die null sein kann (für den Fall einer unverheirateten Person).

Wenn verheiratet ist, hält dies die ID der anderen Person, wie es ein Fremdschlüssel ist.

Eine bessere Lösung ein separater „Ehe“ Tisch sein würde, die mindestens drei Spalten:

MarriageId 
Person1Id 
Person2Id 
... 

Die Person ids sind Fremdschlüssel in den „Person“ Tisch, und Sie sollen die Kombination von MarriageId machen , Person1Id und Person2Id eindeutig, um das Hinzufügen einer Zeile zu vermeiden, in der die Personen ausgetauscht werden.

Obwohl es sowohl sollte darauf hingewiesen werden, dass diese Modelle sind recht einfach und machen Annahmen darüber, wie viele Menschen in einer Ehe sein kann;)

+0

sollten Sie etwas hinzufügen, um anzugeben, wie man mit zwei Heiratsreihen zu tun/verhindert, mit der Person IDs vertauscht. – araqnid

+0

@araqmid - guter Punkt. – ChrisF

2

Hier ist ein hypothetisches Schema Sie verwenden können. Alle Menschen sind in einem einzigen Tisch und jede Person hat eine eindeutige ID. Ehen sind in einer Beziehungstabelle mit Fremdschlüsseln.

PERSONS 
- ID - INTEGER, PK 
- FIRSTNAME - VARCHAR(20) 
- LASTNAME - VARCHAR(20) 
- SEX - CHAR(1) 
- ... any other fields 

MARRIAGES 
- PERSON1_ID - INTEGER, FK 
- PERSON2_ID - INTEGER, FK 
- MARRIAGE_DATE - DATE 
- ANULLMENT_DATE - DATE 
- ... any other fields 
+0

nice - mit Ausnahme der Verwendung der Verb Annullierung ist willkürlich restriktiv ... ich würde mit begin_dt und end_dt und vielleicht ein Ende_reason-Attribut woanders gehen, wenn nötig. – Randy

0

Das klingt wie eine Verwendung für eine einfache Lookup-Tabellen- der wichtige Teil zwei Felder, wobei einer ein Fremdschlüssel für Person1 des ID-Feld der andere ein Fremdschlüssel für Person2 des ID-Feld. Alle Details über die Heirat (Daten, ob es noch aktuell ist usw.) werden ebenfalls in dieser Tabelle gespeichert.

Das würde Menschen erleichtern, die mehrere Ehen, polygame Beziehungen und so weiter hatten. Wenn Sie eine einfache 1: 1-Beziehung wünschen, können Sie einfach eine Fremdschlüsselreferenz auf den Ehepartner im Personenfeld einfügen, aber es wäre wesentlich weniger flexibel.

1

Dies ist eine gute Frage für das Unterrichten von Schemadesign. Was scheint wie ein einfaches Problem leicht ziemlich kompliziert werden kann:

Eg, wie zu handhaben:
- mariages von mehr als zwei Personen
- verschiedene Arten von Ehe (rechtliche, religiöse, andere)
- gleichzeitige Ehen
- Wiederholungs Ehen
- Scheidung
- Selbst Ehe (hey, es passiert auf Glee!)

der Trick, wenn es einen gibt, ist sorgfältig alle Permutationen zu denken, was Sie versuchen, Modell. Nur dann fährst du tatsächlich und modellierst es.

+0

auch, ist es möglich, dass Sie die detaillierte Geschichte Informationen speichern müssen, aber auch eine performante Art und Weise des Erhaltens der aktuellen Ehepartner jeder arbitrary Person benötigen, die einige zusätzliche Infrastruktur benötigen ... Spaß :) – araqnid