2009-04-17 17 views
5

En el código, en general es bastante fácil agregar nuevas clases para proporcionar funcionalidad adicional y tal. Comprendo bastante bien el código de refactorización y lo que implica, así que YAGNI generalmente tiene sentido para mí.¿Se aplica YAGNI al diseño de la base de datos?

Con lo que no estoy tan familiarizado es trabajando y actualizando una base de datos relacional una vez implementada. Estoy desarrollando un pequeño proyecto de mascotas en el que estoy planeando practicar Release Early, Release Often y me pregunto si debería considerar datos que no se utilizarán en la versión inicial, pero que están en la lista de funciones planificadas. ¿Es tan fácil agregar tablas y esquemas de ajuste como agregar nuevas clases? ¿O debería tratar de tener las tablas configuradas para las cosas que posiblemente podría usar, pero que no estoy planeando en el futuro inmediato?

Respuesta

2

Si tiene buenas pruebas que lleguen a la base de datos, extendería YAGNI al diseño de su base de datos.

En general, es fácil agregar columnas y tablas, y es menos fácil de eliminar o modificar de manera significativa. Téngalo en cuenta cuando diseñe tablas (es decir, si un cliente puede tener varios usuarios, no agregue el ID de usuario a la tabla de clientes. Hágalo bien la primera vez).

+0

¿Qué pasa si le da la vuelta a eso ?: supongamos que las especificaciones del cliente son actualmente solo para un artista por gira, pero en el futuro dos de sus bandas podrían ir de gira juntas, y por lo tanto tocar en los mismos shows. ¿Todavía agregas artist_id a la tabla de fechas recorridas, lo que limita el sistema a 1 artista por tourdate? ¿O piensas en el futuro, convirtiéndolo en una relación HaBtM? – Calvin

2

Mi opinión es que YAGNI se aplica a todo, a la codificación, al diseño de bases de datos, al trabajo en la casa (mi esposa no está de acuerdo conmigo con vehemencia), y así sucesivamente.

Cada aplicación basada en DBMS en la que he trabajado ha tenido actualizaciones regularmente para el scema, por lo que esto debe planificarse en los procesos. A los DBA no les gustará la parte de "liberación frecuente" de su propuesta, ya que eso es más trabajo para ellos (o usted si no es una base de datos de DBA).

Pero eso es lo que están allí.

3

Esta es una excelente pregunta. Personalmente, me pareció que modificar un esquema de base de datos y convertir todos los datos a la nueva representación es mucho más difícil que el código de refactorización. Tanto es así que, de hecho, cada vez que comienzo un proyecto que utilizará una nueva base de datos siempre tomo tiempo antes de sentarme y escribir cualquier código para obtener mi especificación lo más exhaustiva posible. Lo que esto conlleva a menudo es anticipar características e incorporar soporte para ellas en la base de datos, incluso si no planeo implementarlas inmediatamente.

Es posible que pueda ser un poco más ágil con la refacturación de bases de datos si está utilizando un marco u otra capa similar que proporciona un mecanismo para alterar la base de datos, pero si está escribiendo SQL directamente, recomendaría invertir una cantidad modesta de tiempo diseñando e implementando un esquema que es menos probable que requiera cambios en el futuro.

+0

Es cierto que la refacturación de bases de datos es más difícil. Por otro lado, también he descubierto que trabajar con bases de datos inflexibles diseñadas desde el principio se convierte en un gran factor de tiempo. La base de datos no refleja los requisitos adecuadamente o es mucho más compleja de lo necesario, por lo que acceder a ella se convierte en un problema. – jalf

+0

Es cierto. Básicamente estaba asumiendo que el diseñador de la base de datos y el programador eran la misma persona, y esa persona es capaz de diseñar una buena especificación de db. Actualizaré mi respuesta para que quede más claro. –

0

El principio sigue siendo válido. No tendrá que preocuparse por agregar campos a las tablas, etc. hasta que tenga muchos datos. Bastantes datos. Por lo tanto, preocupándose demasiado pronto por los detalles de la indexación y los planes de consulta sin ver los datos reales a menudo será un desperdicio de tiempo e incluso provocará problemas arquitectónicos más adelante.

Desafortunadamente, perder el tiempo con el diseño de la base de datos después de una versión de producción puede ser bastante aterrador si no se sigue un buen proceso de prueba/liberación. De manera que, más que el código, quiere hacerlo bien la primera vez con una base de datos.

Con las bases de datos, desea planificar la obtención de los datos, su instalación y almacenamiento, de modo que si sus características "planificadas" incluyen informes, eso afectará mucho el diseño de la base de datos, por lo que tal vez plan para eso.

No es tan fácil modificar un esquema como agregar una clase, pero es factible.

Así que, en general, YAGNI todavía se aplica.

0

No configure las tablas que aún no necesita. Parte de la razón detrás de YAGNI es que no vas a predecir de antemano las cosas correctas que necesitarás. Puede agregar fácilmente nuevas tablas, modificar las tablas existentes, etc. cuando necesite cambiarlas.

Un buen marco debe tener algunas herramientas para realizar migrations, que le permiten actualizar y degradar su base de datos de manera fácil y automática. Si tiene esto en su lugar y es razonablemente cuidadoso con su diseño, debería ser capaz de refaccionarse para llegar a donde debe estar, en lugar de tratar de encontrar todo lo que siempre necesitará por adelantado.

2

Hay una gran cantidad de ideas ágiles sobre el diseño e implementación de la base de datos. Puede interesarle consultar el best practices en www.agiledata.org para conocer algunas de las reflexiones de Scott Ambler sobre el tema. Para mí, generalmente dejo que el diseño de la base de datos crezca a medida que se desarrolla la aplicación. Raramente creo tablas por adelantado. Las excepciones a esto serían cosas como la auditoría y los permisos, cosas que atraviesan todo el diseño. Pensaré en cómo implementar estas cosas incluso si realmente no creo ninguna tabla para ellos por adelantado. Los aspectos transversales afectan el diseño de las tablas, incluso si esas características no son siempre las primeras en salir.

0

El diseño de la base de datos es como cualquier otro tipo de diseño. Su comprensión crece gradualmente, y con un mejor entendimiento viene un esquema en evolución.

Ojalá fuera más fácil explicar cómo hay, de hecho, una base conceptual para el diseño de esquemas de bases de datos relacionales. La única herramienta que realmente lo modela es Object Role Modeling, que ha estado emergiendo durante mucho tiempo. La herramienta más familiar fue Visiomodeler. Para obtener un sabor de él, aquí hay un par de enlaces a Scott Ambler y Scot Becker Pero la conclusión que uno sacaría es que las aserciones tipo objeto-modelado conducen directamente a un modelo lógico relacional específico; por lo tanto, el esquema deberá cambiar a medida que cambie su modelo conceptual.

En la práctica, sus rdbms pueden manejar un poco de flexión si realmente se siente cómodo con las expresiones de transformación; y vale la pena ser bueno en eso.

Nota: Creo que las técnicas de evasión de SQL como LINQ y Object-Relational Models solo serán un impedimento para un diseño en evolución. Puedo estar equivocado. Hay alguna razón para esperar que Entity Framework de Microsoft abarque el Modelo de roles de objetos; pero solo he visto referencias oblicuas a la posibilidad.

1

Hay una base conceptual para el diseño de la base de datos.

En el diseño de bases de datos clásico, existen tres modelos: conceptual, lógico y físico.

El modelo conceptual surge del análisis de requisitos y evoluciona a medida que evoluciona el tema subyacente o cuando se desarrolla la comprensión del tema en cuestión. El modelo conceptual fija los datos elementales en cuanto a la forma y la semántica, pero no se ocupa de cuestiones tales como la composición de la tabla.

El modelo lógico usa el modelo relacional de datos. Puede derivarse del modelo conceptual, pero también se ocupa de la composición de las relaciones. La normalización y otros problemas de composición entran en juego aquí. El modelo lógico anticipa el diseño de la tabla y también las consultas y actualizaciones que la aplicación realizará.

El modelo físico implementa relaciones como tablas, y también agrega todas las otras características como índices, espacios de tabla, etc.necesario para realmente construir la base de datos. Se deriva del modelo lógico, pero el volumen de datos, la carga, el rendimiento y el espacio en disco entran en juego.

Esto suena largo y tedioso, pero en realidad es rápido, si sabes cómo hacerlo. Todo se puede hacer en cuestión de semanas, mientras que el resto del equipo sigue debatiendo las especificaciones funcionales. Para un proyecto realmente pequeño (6 tablas, 50 columnas) se puede hacer en días, con solo lápiz y papel. Para proyectos más grandes, hay herramientas que hacen que el diseño sea más automático, menos propenso a errores y fácil de diagramar.

Pero, ¿qué sucede cuando descubres que el modelo conceptual era inexacto o incompleto, y que los otros dos modelos y la base de datos en sí necesitan ser alterados? Ahí es donde el Data Independence viene al rescate. La independencia de los datos para el diseño de la base de datos es lo que hace la encapsulación para el diseño de objetos. A saber, evita que un ajuste menor en un lugar se propague por todos los objetos de la aplicación. Los objetos solo dependen de los datos que usan.

Si se debe agregar una tabla nueva a un esquema, las posibilidades de que se rompa alguna aplicación son infinitamente pequeñas. Incluso si se debe modificar una tabla existente, las consultas que solo usan las columnas antiguas no notarán ninguna diferencia. Incluso cuando los objetos dependen del cambio, aún puede darle un nombre nuevo a la tabla modificada y luego crear una vista con el nombre anterior que haga que parezca que la tabla anterior aún está allí.

Y la independencia física de los datos está casi completa en un buen DBMS. Puede reorganizar datos, agregar y eliminar índices, etc. y no debería tener que cambiar ninguna de las aplicaciones.

En resumen, la gestión del cambio se puede hacer de manera brillante utilizando los buenos productos DBMS que existen. Desafortunadamente, muchos de los administradores de bases de datos y programadores no saben cómo hacer un uso adecuado de estas funciones de DBMS, a pesar de que llevan años funcionando.

Cuestiones relacionadas