Supongamos que hay un esquema de base de datos definido así:
Person.mail_address_key ----- Address.address_key
Person.billing_address_key ----- Address.address_key
A Person
tiene una dirección postal y una dirección de facturación. Como técnica de desnormalización, creamos una Address
tabla separada . La mayoría de las veces el mail_address_key
y el billing_address_key
de un solo Person
habrá el mismo valor (es decir: la llave de su dirección postal y de facturación es la misma).
En mi base de datos de la Address
cuenta con una identidad (la tecla de dirección). Pero, en mi modelo de dominio , no veo una razón convincente para Address
que sea una Entidad, me gustaría que fuera un Objeto de valor.
- En DDD, ¿es esta una opción? ¿O los objetos de valor suelen ser un grupo de columnas (a diferencia de una tabla)? Estoy jugando al abogado del diablo aquí, porque no creo que la base de datos deba dictar la estructura del modelo de dominio, sino solo asegurarme.
- Si es así, ¿dónde / cuándo / cómo pierde la dirección su identidad de base de datos para que pueda usarse como un Objeto de valor en la Capa de dominio? ¿O se supone que debo mantener el identificador de la base de datos en el objeto de valor?
- Cuando el modelo necesita persistir en la base de datos, ¿cuál es el proceso? ¿Se supone que debo pasar por un proceso de a) Buscar una dirección por estos campos, b) si no existe, crear una nueva c) si es así, actualizar los campos?
domain-driven-design
domain-model
value-object
Daniel Kaplan
fuente
fuente
Respuestas:
La base de datos no debe dictar la estructura del modelo de dominio, por lo que tiene razón en eso. Los objetos de valor se pueden almacenar en la base de datos como una columna o tabla, dependiendo del tipo de datos que se supone que debe transportar el objeto de valor.
Su código de dominio no debe estar plagado de propiedades que son para otras preocupaciones como la persistencia, ya que deben ser completamente ignorantes de persistencia. Realmente debes enfocarte en tu raíz agregada. Debe tener alguna forma de identificar su raíz agregada cuando la guarda de nuevo en la base de datos, por lo que, en ese momento, solo necesitaría verificar el registro de la tabla Persona (supongo que Person es su raíz agregada) y ver si hay un valor en el campo MailingAddressID o BillingAddressID. En ese momento, puede decidir si crear nuevas direcciones y cambiar los enlaces para que apunten a las nuevas direcciones o sobrescribir las direcciones que ya están vinculadas.
Como expliqué de alguna manera en la respuesta anterior, debe hidratar y deshidratar su gráfico de objeto en función de su raíz agregada. Por lo tanto, cuando su repositorio obtiene su raíz agregada de la base de datos, también hidratará todas las entidades necesarias y objetos de valor bajo su raíz agregada que están asociados con su raíz agregada en la base de datos. Lo mismo es cierto cuando va a guardar la raíz agregada nuevamente en la base de datos. Su repositorio debería ser capaz de manejar todo su gráfico de objetos bajo la raíz agregada.
fuente
DDD no aplica el esquema DB en absoluto. El objeto de valor puede implementarse como un grupo de columnas, entidad db (su tercera solución) o simplemente en una forma desnormalizada si puede usar una base de datos orientada a documentos, por ejemplo. Depende de las diferentes circunstancias, cuál es la mejor opción.
Tenga en cuenta que DB es solo una herramienta para mantener su estado de dominio. No debe forzar ninguna decisión de diseño. Si por alguna razón tiene que usar identidad para la representación de su objeto de valor en DB, hágalo, pero no filtre este detalle de implementación en el dominio mismo. Cree un contenedor / extienda las clases de dominio / lo que su marco permita y agregue la ID en una clase de infraestructura completamente separada que permita que la aplicación / marco persista en el estado.
fuente
No veo ningún requisito especial de DDD en este caso, puede modelar las direcciones de correo y facturación como propiedades de la persona y aún almacenarlas en una tabla separada, por ejemplo:
o
fuente