En el diseño controlado por dominio, ¿cómo convierto una tabla de base de datos con una clave principal en un objeto de valor?

8

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 Persontiene una dirección postal y una dirección de facturación. Como técnica de desnormalización, creamos una Addresstabla separada . La mayoría de las veces el mail_address_keyy el billing_address_keyde un solo Personhabrá 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 Addresscuenta con una identidad (la tecla de dirección). Pero, en mi modelo de dominio , no veo una razón convincente para Addressque sea una Entidad, me gustaría que fuera un Objeto de valor.

  1. 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.
  2. 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?
  3. 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?
Daniel Kaplan
fuente
Convertir una dirección de correo electrónico en un objeto de valor utilizable puede ser muy difícil, porque probar las direcciones de correo electrónico para determinar la igualdad no es tan fácil y probablemente tampoco lo sea probar las direcciones postales.
SpaceTrucker
@SpaceTrucker No creo haber leído nada que diga que debería tener en cuenta tu decisión de convertir un modelo en un Objeto de valor.
Daniel Kaplan

Respuestas:

2

En DDD, ¿es esta una opción? ¿O los objetos de valor suelen ser un grupo de columnas (en lugar 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.

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.

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?

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.

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?

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.

Aaron Hawkins
fuente
Ah, eso tiene mucho sentido. Gracias por la ayuda.
Daniel Kaplan
2

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.

Mequrel
fuente
¿Puedes mostrar algunas implementaciones concretas (puede ser un pseudocódigo)?
Daniel Kaplan
-1

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:

Person
+ MailingAddress : Address
+ BillingAddress : Address

o

Person
+ MailingAddressID
+ MailingAddress : Address
+ BillingAddressID
+ BillingAddress : Address
Tien Do
fuente
1
No siento que esto esté respondiendo todas (o incluso la mayoría) de mis preguntas
Daniel Kaplan