¿Los elementos como claves externas, restricciones, valores predeterminados, etc. deben ser manejados por el sistema de administración de la base de datos (en este caso, MS SQL 2005) o la aplicación? He escuchado opiniones de ambas partes y, sinceramente, no estoy seguro de qué camino tomar.
Existe la posibilidad de que abarquemos múltiples servidores / bases de datos y no creo que las claves externas se puedan usar en servidores vinculados. Además de eso, hay algunas referencias circulares en el diseño de la base de datos que me impiden usarlo ON UPDATE CASCADE
en todo.
La base de datos es MS SQL 2005 (posiblemente 2008) y todas las interacciones con ella deben pasar por la aplicación.
Respuestas:
Si existe alguna posibilidad de que la base de datos se modifique fuera de su aplicación, desea las restricciones en la base de datos. Si el DB es y siempre será nada más que el back-end de la aplicación, puede omitirlos, aunque los documentaría por si acaso y probablemente los mantendría si el rendimiento no fue tan malo. (El software de Peoplesoft funciona de esta manera: las restricciones están en el software y (no estoy inventando esto) ejecuta todo como SYS en Oracle).
Desea que la aplicación monitoree cosas como esa, para que pueda reaccionar de manera inteligente y, en el mejor de los casos, enviar un mensaje de error de la base de datos al usuario.
Y sí, esta es una cobertura doble, pero sin ella probablemente obtendrá corrupción de datos evitable o una mala interfaz de usuario.
fuente
Idealmente, ambos. No se debe no tener la DB manejarlo, pero de nuevo, si la aplicación viene con datos que el PP va a rechazar, que es un error de ejecución, por lo que la aplicación debe tener al menos algo de código dedicada a preservar la integridad referencial. Además, configurar las restricciones correctas en SQL en la base de datos es mucho más simple que configurar el código para el lado del cliente, por lo que hacerlo en la base de datos reduce en gran medida la cantidad de trabajo que necesita hacer.
fuente
Si es importante, deje que la base de datos lo maneje. De esa manera, no tiene que preocuparse de que alguien acceda a la base de datos fuera de su aplicación y cambie o ingrese algunos datos inconsistentes o duplicados. A menos que se trate de cosas específicas de aplicaciones de alto nivel (como "solo los usuarios en el departamento X que tengan una clase de acceso de ZZZ deberían poder pertenecer al grupo 999"), pero eso no suele denominarse integridad "referencial".
fuente
Yo diría que poner en la base de datos. Si está utilizando un marco persistente, recogerá las claves automáticamente.
fuente
Ambos son definitivamente el camino a seguir. Querrá una lógica de validación en su código para evitar actualizaciones e inserciones incorrectas, así como para informar a los usuarios de lo que está mal y cómo solucionarlo. Y tener la base de datos allí para detener las cosas, de modo que si algo entrara y no se ejecutara a través de la validación, no sería bueno romper las cosas en la línea.
Debe mantener las cosas de la base de datos de nivel superior. Por ejemplo, hacer cumplir la referencia integrety y quizás algunas no nulas. Pero no se preocupe por restringir las longitudes o formatos, ya que se representa mejor en la aplicación por completo.
fuente