Modellierung von eins zu null oder einer Beziehung (Z-Kardinalität)

8

Ich bemühe mich, den besten Weg zu finden, 1: 0,1-Beziehungen zu modellieren ("kann einen haben" oder "hat höchstens einen"). Ich glaube, das nennt man Z-Kardinalität.

Angenommen, ich habe zwei Klassen Widget und WidgetTest . Nicht alle Widgets sind getestet und der Test ist destruktiv, so dass es höchstens einen WidgetTest pro Widget geben kann. Nehmen Sie außerdem an, dass es unangemessen ist, die WidgetTest-Felder zu Widget hinzuzufügen.

Ich möchte meine öffentliche Schnittstelle:

%Vor%

Modell 1: Widget hat eine WidgetTest-Eigenschaft und in der Datenbank hat die Widget-Tabelle einen eindeutig eingeschränkten Fremdschlüssel für WidgetTest. Mein DBA argumentiert, dass dies zulässt, dass ein WidgetTest-Datensatz ohne ein Widget existiert.

%Vor%

Modell 2: Widget verfügt über eine private Sammlung von WidgetTest und erzwingt die Beziehung von 0,1 durch Hinzufügen oder Entfernen eines einzelnen Objekts aus der Sammlung, die von einer öffentlichen WidgetTest-Eigenschaft gesteuert wird. Die Datenbank modelliert dies als 1: m, wobei WidgetTest einen eindeutig eingeschränkten Fremdschlüssel für Widget hat. Ich argumentiere, dass dies bedeutet, das Modell an das Datenbankschema anzupassen (d. H. Mehr Arbeit für mich).

%Vor%

Welches Modell ist besser? Was ist mit NHibernate einfacher zu erreichen? Oder gibt es einen dritten Weg?

Bearbeiten ... Hier ist, womit ich endete:

%Vor%     
Jamie Ide 05.02.2010, 16:52
quelle

4 Antworten

4

Mein Ansatz bestand darin, eine Eins-zu-Viele-Beziehung in den Zuordnungen zu modellieren, aber die "Viele" auf ein einzelnes Element zu beschränken. Dies ermöglicht die optionale Eins-zu-Eins-Funktion und garantiert außerdem, dass Ihre WidgetTest-Instanz beim Speichern des Widgets beibehalten wird. Zum Beispiel:

%Vor%     
nw. 05.02.2010, 22:21
quelle
1

Wenn Sie sagen "Nehmen Sie an, dass es unangemessen ist, die WidgetTest-Felder zu Widget hinzuzufügen", meinen Sie das in Ihren Domänenobjekten oder in der Datenbank. Wenn Sie sich darüber freuen, dass sich die Felder in der gleichen Tabelle in der Datenbank befinden, wie wäre es mit WidgetTest als Widgetkomponente? Lassen Sie die NHibernate-Zuordnungsdatei folgendermaßen aussehen:

%Vor%

Geben Sie die Tabellenstruktur:

%Vor%

Wenn Sie trotzdem die von Ihnen angegebene öffentliche Schnittstelle verwenden würden, würde WidgetTest jedoch zu einem Wertobjekt werden, das Sie möglicherweise nicht benötigen.

    
Graham 05.02.2010 17:02
quelle
0

Ich habe 2 weitere Ideen hier

  • Verknüpfen Sie Tabelle und Karte als Komponente
  • Ignoriere die ID der abhängigen Klasse
Firo 02.02.2012 16:43
quelle
0

Die Antwort von NW. kann zu der Ausnahme " A collection with cascade=”all-delete-orphan” was no longer referenced by the owning entity instance " führen.

Dies ist der Fall, wenn Sie inverse="true" und cascade="all-delete-orphan" in Ihrer Zuordnungsdatei verwenden.

Dies liegt daran, dass die Antwort von nw. jedes Mal, wenn der get -Accessor aufgerufen wird, eine neue Liste erstellt und nichts mit der über den set -Accessor übergebenen Liste tut. Daher hat NHibernate nicht die IList<WidgetTest> -Referenz, die beim Erstellen des Objekts ursprünglich übergeben wurde, und kann nicht mit der Kaskade fortfahren.

Um dies zu beheben, müssen wir etwas mit dieser IList<WidgetTest> -Referenz tun und darauf achten, dass die Referenz nicht entfernt wird.

%Vor%

Zuordnung:

%Vor%

Inspiration für die Verbesserung:

Ссылка

    
Iain Fraser 13.09.2016 08:51
quelle