Pregunta

Hace un tiempo tuve una discusión con mis colegas sobre la persistencia de modelos de dominio y si debemos hacer cumplir las restricciones de clave externa a nivel de base de datos.

Mi primera reacción fue que el uso de una base de datos relacional implicaba la aplicación de tales restricciones, pero algunos argumentó que la base de datos debe ser visto como nada más que un mecanismo de persistencia y por lo tanto se debe evitar la aparición de la lógica de negocio en él. Terminamos por no usar restricciones de clave externa.

Aquí es mi pregunta (espero que no sea demasiado genérico): ¿Se considera una buena práctica para hacer cumplir las restricciones de claves En estos casos

?
¿Fue útil?

Solución

Hacer cumplir las restricciones, pero no confíe en ellos en su lógica de negocio

  • No negocio la lógica de la base de datos: Estoy de acuerdo con el principio. Y si su no es de SQL código de negocio depende en las limitaciones de bases de datos para comprobar su consistencia de base de datos, entonces debería reconsiderar su lógica de negocio.
  • No hay nada malo de tener limitaciones de bases de datos además a su lógica de negocio. Sobre todo, porque cosas como la integridad referencial con claves externas y otras restricciones UNIQUE son fáciles de hacer y RDBMS están haciendo ese trabajo por usted de manera muy eficiente sin mucho mantenimiento.
  • ¿Usted no utiliza índices en la base de datos también, porque no es puramente Relacionado con persistencia?
  • Investigación y de corrección de errores de software puede tomar algún tiempo, pero definitivamente no quieren pasar más tiempo limpiando o (peor) perder algunos datos, sólo porque guardó a sí mismo un problema de escribir script de una línea de FK. Realmente: el obtener algo gratis aquí y su rechazan
  • ?
  • [INS-1]: se puede garantizar que los datos en su base de datos sería administrado sólo a través de su aplicación? Siempre parece haber excepciones, la mayoría de los usuarios avanzados, que hacen a veces (muy rara vez :-) cometer errores y ejecutar sentencias SQL a la limpieza de su código, estados de actualización (a valores no válidos debido a errores tipográficos), etc.
  • [EDIT-2]: Edificio de dominio impulsada modelo no es una excusa para no contratar a un buen administrador de base de datos. El uso de ORM no es una excusa para no contratar a un buen desarrollador de base de datos.

Pero si usted y su equipo es capaz de escribir de software libre de errores y manejar todos los posibles escenarios de excepción en su código (incluyendo fallos de hardware / red / maniquí-usuario / programador-error), entonces "Hei, ¿por qué molestarse con redundantes limitaciones FK ...." - -teaser -

Otros consejos

Creo que sí, creo que es no tanto algo de lógica de negocio, pero evitando los datos "malos" de ser introducidos en la base de datos. Una vez que la base de datos se hace muy grande de estas limitaciones evitarán dolores de cabeza en el futuro.

Esto especialmente entrarán en vigor cuando se tienen varios desarrolladores de aplicaciones en desarrollo contra los mismos datos. Esto asegurará que así sólo se pueden introducir datos válidos. Después de haber restricciones controladas en 1 punto en vez de en las aplicaciones X es sin duda beneficiosa.

Me siento como haciendo caso omiso de herramientas muy útiles (integridad de los datos de nivel de base de datos) por el bien de una metodología de desarrollo puro es contraproducente. Las bases de datos son muy buenos en este tipo de cosas ... que lo hagan.

En algún momento cada metodología comienza a descomponer y sólo hay que ser práctico.

Yo solía pensar que sí, pero mi opinión ha cambiado desde que empecé a escribir una gran cantidad de sistemas orientados a los recursos. Por lo general, mucho más que las restricciones de claves extranjeras solo se requieren para validar un fragmento de datos - por ejemplo, un billete que se encuentra en estado "asignado" debe tener un válido "assigned_to" valor, y así sucesivamente. Todas esas reglas deben ser colocados en una rutina de validación de algún tipo, y aunque teóricamente es posible que no herido tener la validación adicional en el nivel de base de datos, si la validación de nivel de aplicación está funcionando, el control de la extranjera restricción de clave simplemente se desperdicia ciclos. Mucho peor, sin embargo, ahora que ha conseguido la lógica sobre su modelo de datos repetido en dos lugares - el código de validación y las limitaciones de bases de datos.

Piénsalo de esta manera: ¿le gustaría mover cualquier otra lógica de la aplicación en la base de datos (por ejemplo, a través de procedimientos almacenados) si no es necesario? Si no se vieron obligados a hacerlo por consideraciones de rendimiento, creo que la respuesta debe ser en general "no".

"Mi primera reacción fue que el uso de una base de datos relacional implicaba la aplicación de tales restricciones, pero algunos argumentó que la base de datos debe ser visto como nada más que un mecanismo de persistencia y por lo tanto se debe evitar la aparición de la lógica de negocio en él. terminamos por no usar restricciones de clave externa ".

Sí, bueno, la mayoría mediocres siempre gana ese tipo de debate por la mera fuerza de los números, por desgracia.

Si todavía quiere pelear esa batalla, es posible pedir a sus oponentes cómo van a mantener a cualquier usuario de "editores de bases de datos directa" (ala DB2 auxilios, SPUFI, ...) y cómo van a evitar que alguien la corrupción de la base de datos utilizando este tipo de herramientas (que pasar por alto sus limitaciones comerciales programados por definición).

Si quieres seguir el paradigma Driven Design dominio, entonces la respuesta sería sí para cualquier cosa dentro de un agregado, y no por los enlaces a través del agregado.

En casi todos los casos, usted quiere cualquier cosa bajo la raíz agregada que se elimina cuando se elimina la raíz en sí, y así tener las claves externas que representan a esto, con eliminaciones en cascada, le permiten lograr esto a nivel de base de datos. Usted también podría tener sus repositorios hacer la cascada elimina a sí mismos si no quiere hacerlo a un nivel DB, pero el punto sigue en pie que los niños de agregados no deben existir sin la raíz.

Para preocupaciones cruzada de agregados, es probable que se trataría de decisiones de negocio en cuanto a lo que debe suceder cuando uno o el otro se retira. A menudo, usted quiere tratar con esta forma asíncrona para permitir la escalabilidad, y así su modelo de dominio termina siendo eventualmente consistentes. Por lo tanto, no tiene sentido en estos casos para hacer cumplir las claves externas, ya que habrá una ventana de tiempo donde uno o no puede existir la otra clave.

Espero que ayude! Y para más información, sin duda la salida libro de Evans en Domain Driven Design -. y los numerosos enlaces en la web también

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top