database - psicomotricidad - esquema corporal-ejercicios y actividades
¿Estrategias para hacer frente a la evolución del esquema? (5)
Actualmente estamos utilizando SQL enrollado a mano en objetos de acceso a datos y una gran cantidad de procedimientos almacenados y disparadores que ascienden a alrededor de 20k líneas de código. Estamos descubriendo que los cambios simples están causando el trabajo de un par de días para solucionar y que los plazos se pierdan.
Los cambios incluyen modificaciones a las tablas para hacer frente a los datos adicionales, refactorización general del esquema en función de los informes de control de calidad / usuario, etc. Es un sistema muy activo que se está construyendo para reemplazar algo antiguo y lento.
Analizamos las soluciones PHP ORM disponibles para tratar de limitar los efectos de estos cambios, pero fueron demasiado lentos para hacer frente a nuestro esquema; Los resultados sql "simples" tomaban órdenes de magnitud más larga que nuestras consultas personalizadas y hacían que las vistas de página de ~ .5 tuvieran más de 20 segundos.
¿Qué mejores prácticas / estrategias podría considerar para hacer frente a la evolución del esquema con bases de datos relacionales, en un contexto general?
Editar: se olvidó de mencionar los factores desencadenantes; tenemos una gran cantidad de datos que se basan en cambios en cascada, por ejemplo. un cambio de precio aquí para este usuario actualiza un precio allí para ese usuario, etc.
Mi consejo sería deshacerse de los procedimientos almacenados y, en su lugar, usar SQL en línea, tal vez mantenido en archivos de texto / xml. Encuentro que los SProcs son mucho más molestos y lentos de mantener. Una vez que se genera el plan de consulta (la primera vez que se ejecuta la consulta) notará una diferencia insignificante en el rendimiento. Además, podrás controlar la versión de tus scripts DB completos ...
Sugiero usar una estrategia de compilación continua (o al menos cada noche) .
Reconstruya la base de datos en cada checkin, o al menos una vez por día.
También una vez al día, ejecute pruebas unitarias para ejercitar cada bit de código, ya sea en un procedimiento almacenado, un desencadenante o una capa de acceso a datos.
Hay un gran costo para escribir procs almacenados, pero esto identificará los descansos de inmediato.
Una vez que sepa dónde está el descanso, puede arreglarlo.
Me interesaría escuchar las experiencias de otras personas con esta estrategia aplicada a los cambios en la base de datos.
Es posible que desee consultar este libro sobre Refactorización de bases de datos: diseño de base de datos evolutiva .
Utilizamos Enterprise Architect para nuestras definiciones de base de datos. Incluimos procedimientos almacenados, desencadenadores y todas las definiciones de tablas definidas en UML. Las tres características brillantes del programa son:
- Importar diagramas UML desde una conexión ODBC.
- Genere SQL Scripts (DDL) para todo el DB a la vez
- Genere documentación personalizada con plantilla de su base de datos.
Nunca he estado más impresionado con ninguna otra herramienta en mis más de 10 años como desarrollador. EA admite Oracle, MySQL, SQL Server (múltiples versiones), PostGreSQL, Interbase, DB2 y Access de una sola vez. Cada vez que he tenido problemas, sus foros han respondido a mis problemas de inmediato. ¡¡Muy recomendable!!
Cuando entran cambios DB, hacemos entonces en EA, generamos el SQL y lo chequeamos en nuestro control de versiones (svn). Usamos Hudson para construir, y construye automáticamente la base de datos a partir de scripts cuando ve que ha modificado el sql registrado.
Aquí están mis sugerencias:
- Intenta eliminar la funcionalidad menos utilizada. Cuestiona las características que no se usan todo el tiempo. Cada característica de una aplicación tiene varios niveles de costos asociados (mantenimiento, soporte, pruebas de regresión, complejidad del código, etc.).
- Manténgase alejado de los procedimientos almacenados, a menos que no haya absolutamente ninguna manera de hacerlo de manera eficiente y de manera escalable en el código.
- Introduzca una solución ORM de forma gradual (utilizando la refactorización para pasar de JDBC a ORM) para reducir la cantidad de código y la complejidad del código en las operaciones CRUD
- Cree pruebas funcionales, de integración y de unidades cuando arregle un error e incorpore esas pruebas en el sistema de integración continua. Automatice sus pruebas de regresión tanto como sea posible para identificar problemas tan pronto como se presenten en un check-in.
- En general, siempre que arregle un error, use esa oportunidad para refactorizar para desacoplar las implementaciones / módulos de código.
Si tiene preguntas sobre problemas de migración de la base de datos, esto podría ayudar: http://shashivelur.com/blog/2008/07/hibernate-db-migration/