2009-03-24 13 views
43

Ich habe nicht wirklich irgendwelche Beispiele gesehen, aber ich nehme an, dass sie in der enthaltenden Entitätstabelle innerhalb der Datenbank gespeichert sind.Wie werden Wertobjekte in der Datenbank gespeichert?

Ie. Wenn ich eine Person entity/aggregate root und eine entsprechende Person-Tabelle hätte, wenn sie ein Value-Objekt namens Address hätte, würden Address-Werte in dieser Person-Tabelle gespeichert werden!

Macht das Sinn für eine Domäne, in der ich andere Entitäten wie Firmen usw. habe, die eine Adresse haben?

(Ich bin derzeit eine Projektmanagement-Anwendung zu schreiben und versuchen, in DDD zu bekommen)

Antwort

84

Es ist okay, Wert Objekte in einer separaten Tabelle zu speichern, um die Gründe, die Sie beschrieben haben. Ich denke jedoch, dass Sie Entitäten gegen VOs missverstehen - es ist keine beharrliche Sorge.

Hier ist ein Beispiel:

Angenommen, ein Firma und Person beide haben die gleiche Mail-Adresse . Welche dieser Aussagen gelten als gültig?

  1. "Wenn ich Company.Address ändern, möchte ich Person.Address automatisch jene Änderungen bekommen"
  2. "Wenn ich Company.Address ändern, es darf nicht Affekt Person.Address"

Wenn wahr ist, Adresse sollte ein Entity, und daher hat es o wn Tabelle

Wenn wahr ist, Adresse sollte ein Value Object sein. Es könnte als eine Komponente in der Tabelle der übergeordneten Entität gespeichert werden, oder es könnte eine eigene Tabelle haben (bessere Datenbanknormalisierung).

Wie Sie sehen können, wie Adresse beibehalten wird, hat nichts mit Entity/VO Semantik zu tun.

7

Die meisten Entwickler denken zuerst in der Datenbank vor allem anderen. DDD weiß nicht, wie Persistenz gehandhabt wird. Das ist Sache des Repositories, um damit umzugehen. Sie können es als XML, SQL, Textdatei usw. beibehalten. Entitäten/Aggregate/Wertobjekte sind Konzepte, die sich auf die Domäne beziehen.

Erklärung von Vijay Patel ist perfekt.

2

Ich habe begonnen, DDD mit Eric Evans Buch und dem ausgezeichneten dddsample Cargo-Projekt als Beispiel zu lernen. http://dddsample.sourceforge.net/

Also für diejenigen (wie mich), die den Unterschied in der Code-Umsetzung dieser Nuance in der Domain Model Schicht materialisieren will, würde ich sagen:

Die overidded Methode Equals oder/und sameIdentityAs/SameValueAs (von Schnittstelle Entity und ValueObject) sind, denke ich, der Ort ihres Ausdrucks.

Es ist nur mein Feelin' :)

Ich denke, interessant, dies zu lesen:

http://martinfowler.com/bliki/ValueObject.html