Erstellen von PostgreSQL Tabellen + Beziehungen - PROBLEME mit Beziehungen - ONE to ONE

8

Also soll ich dieses Schema + Beziehungen genau so erstellen, wie diese ERD es darstellt. Hier zeige ich nur die Tabellen, mit denen ich Probleme habe:

Ich versuche also, eins zu eins zu machen, aber aus irgendeinem Grund, egal, was ich verändere, bekomme ich eins zu viele auf dem Tisch, der den Fremdschlüssel hat.

Dies ist meine SQL für diese beiden Tabellen.

%Vor%

Hier bekomme ich das Gleiche. Ich bekomme nicht die Eins-zu-eins-Beziehung, sondern eine zu vielen. Rechnungszeile ist eine schwache Entität.

Und hier ist mein Code für das zweite Bild.

%Vor%

Ich würde jede Hilfe schätzen. Danke.

    
Georgi Angelov 23.02.2013, 05:18
quelle

1 Antwort

23

Eins-zu-Eins wird in Standard-SQL als erstklassiger Beziehungstyp nicht gut dargestellt. Ähnlich wie viele-zu-viele, die mit einer Verbindungstabelle und zwei Eins-zu-Viele-Beziehungen erreicht werden, gibt es in SQL kein echtes "eins zu eins".

Es gibt ein paar Optionen:

  • Erstellen Sie eine gewöhnliche Fremdschlüsseleinschränkung (Stil "eins zu viele") und fügen Sie dann eine UNIQUE -Einschränkung für die referenzierende FK-Spalte hinzu. Dies bedeutet, dass nicht mehr als einer der referenzierten Werte in der verweisenden Spalte erscheinen darf, sodass es optional eins zu eins ist. Dies ist ein ziemlich einfacher und ziemlich fehlerverzeihender Ansatz, der gut funktioniert.

  • Verwenden Sie eine normale FK-Beziehung, die 1: m modellieren könnte, und lassen Sie Ihre App sicherstellen, dass sie in der Praxis immer nur 1: 1 ist. Ich empfehle das nicht, es gibt nur eine geringe Schreibleistung beim Hinzufügen des eindeutigen FK-Index und es hilft, die Datengültigkeit sicherzustellen, App-Fehler zu finden und zu vermeiden, andere zu verwirren, die das Schema später ändern müssen.

  • Erstellen Sie gegenseitige Fremdschlüssel - nur möglich, wenn Ihre Datenbank aufschiebbare Fremdschlüsseleinschränkungen unterstützt. Dies ist ein wenig komplexer zu programmieren, ermöglicht Ihnen jedoch die Implementierung von Eins-zu-eins-Beziehungen. Jede Entität hat einen Fremdschlüsselverweis auf die PK der anderen in einer eindeutigen Spalte. Eine oder beide Bedingungen müssen DEFERRABLE und entweder INITIALLY DEFERRED oder mit einem Aufruf SET CONSTRAINTS verwendet werden, da Sie eine der Abhängigkeitsprüfungen verschieben müssen, um die zirkuläre Abhängigkeit einzurichten. Dies ist eine ziemlich fortgeschrittene Technik, die für die überwiegende Mehrheit der Anwendungen nicht notwendig ist.

  • Verwenden Sie Vorab-Trigger, wenn Ihre Datenbank diese unterstützt. So können Sie überprüfen, dass beim Einfügen von Entität A genau eine Entität B eingefügt wird, und umgekehrt, mit entsprechenden Überprüfungen für Aktualisierungen und Löschungen. Dies kann langsam und in der Regel unnötig sein, und viele Datenbanksysteme unterstützen keine Vorab-Trigger.

Craig Ringer 23.02.2013, 05:34
quelle