¿La creación y eliminación continua de tablas es un signo de un defecto arquitectónico?

11

Recientemente tuve una discusión con un desarrollador que mencionó que durante el desarrollo del programa, crean y eliminan rutinariamente tablas y columnas de forma regular mientras trabajan en nuevas funciones y justifican cosas al decir que esto es normal cuando se utiliza un proceso de desarrollo ágil.

Como la mayor parte de mi experiencia se encuentra en un entorno de desarrollo en cascada, me pregunto si esto realmente se considera apropiado en el desarrollo ágil, o si esto podría ser un signo de un problema subyacente, ya sea con la arquitectura del programa o con su seguimiento del proceso ágil.

rjzii
fuente
Un comentario sobre la base de datos, la última vez que se verificó, hay más de 700 tablas y otros han escuchado mencionar que "no hay tiempo suficiente para refactorizarlo".
rjzii
24
700 mesas y no hay suficiente tiempo para refactorizar? Puedo oler el fracaso hasta aquí.
Adam Crossland
77
¿700 mesas USADAS o 700 mesas, muchas de las cuales son huérfanas?
Ben Brocka
1
@AdamCrossland En serio ... Me viene a la mente el Ooh That Smell de Lynyrd Skynyrd. Pero en una nota seria, las tablas desnormalizadas a veces son una buena opción de diseño en bases de datos pesadas o de lectura que tienen una gran carga de informes.
maple_shaft
1
@maple_shaft Claro, se puede abusar de cualquier tecnología, como cualquier otra cosa que tenga que sopesar los pros / contras y probar, probar, probar. Sin embargo, las vistas materializadas pueden ofrecerle una salida si se encuentra desnormalizando sus tablas. Creo que su punto es solo una razón más para tener un DBA o al menos un desarrollador con un fuerte DB-fu en el personal para tirar de las riendas cuando todos los demás están cargando con un diseño claramente pobre. Mi mejor trabajo no ha sido mientras codifico o diseño, sino que evito que otros tomen decisiones horribles.
Mike Cellini

Respuestas:

21

Todos los días me resulta cada vez más evidente que "ágil" se está convirtiendo en sinónimo de mal pensado, caótico, apresurado y sin asiento. Y ninguna de esas cosas son compatibles con un enfoque ágil tal como lo entiendo.

Tener un proceso ágil efectivo y repetible no es fácil, y no creo que reduzca inherentemente la cantidad total de trabajo a realizar a pesar de que puede conducir a mejores productos.

Si han dicho que no tienen tiempo para "refactorizar" la base de datos, entonces probablemente tampoco tengan tiempo para configurar el control de versiones y la migración de la base de datos. Probablemente no se hayan tomado el tiempo para crear un conjunto de pruebas funcionales para ello. Pienso en todas esas cosas cuando pienso en un proceso ágil sólido que se dirige hacia el éxito.

Al final, Agile es solo una palabra. Lo que está haciendo día a día determina si tendrá éxito o no.

Adam Crossland
fuente
2
Tener un proceso ágil eficaz debería significar más trabajo inicial debido al enfoque repetido en entregar solo software funcional después de cada sprint. Si se hace bien, entonces conduce a mejores posibilidades de éxito. Waterfall es en realidad mucho más eficiente si asume que los requisitos son estáticos y los recursos del proyecto no cometen errores. Sin embargo, esto es fantasía en la mayoría de las situaciones.
maple_shaft
1
@maple_shaft, solo así. Ser ágil no elimina el arduo trabajo de crear productos.
Adam Crossland
2
Tengo la sensación de que si este equipo estuviera utilizando un enfoque en cascada, sería igual de caótico y cualquier solicitud de cambio sería un desastre.
JeffO
Bien dicho, Jeff O.
Adam Crossland
11

Si bien no es inusual crear y soltar tablas a medida que evoluciona el diseño, es posible que se realice una limpieza para asegurarse de que su base de datos realmente esté usando todas esas tablas.

Sí, Agile se trata de refactorizar, pero si ahora dicen que el sistema es demasiado grande para refactorizar, han dejado de hacer Agile y ahora solo están programando Cowboy. Al equipo de desarrollo no le gustará que lo llamen así, pero eso es lo que están haciendo. Montando el rango disparando cualquier cosa que se mueva.

Un DBA ayudará, solo asegúrese de obtener un DBA que comprenda tanto el desarrollo como el desarrollo ágil. Su equipo de desarrollo necesita ser dominado, no encarcelado.

Bill Leeper
fuente
5

En general, a menudo crear nuevas tablas y agregar nuevas columnas es muy normal en un proceso donde la programación y la administración de la base de datos no están estrictamente separadas. Una nueva característica puede crear nuevos datos que deben ir a alguna parte. Intenta estrictamente evitar eso y terminas con un modelo de plataforma interna .

El software bien escrito apenas nota esos nuevos objetos de la base de datos, por lo que nada se rompe solo por una nueva columna en alguna tabla.

Por otro lado, las columnas que caen regularmente o incluso las tablas son sospechosas. Una nueva característica nunca necesita que se elimine una tabla, por lo que esto podría ser una señal de que las personas trabajan completamente sin plan.

usuario281377
fuente
1
La creación de nuevas tablas y columnas no me molesta cuando está justificado, pero se ha señalado que eliminar tablas (y columnas) generalmente significa que se perdió algo de trabajo debido a que alguien planeó de manera inapropiada o alguien más decidió que la característica no era necesaria después de todo. Del mismo modo, el número de corte de las tablas es una preocupación debido a la falta de normalización en ellas.
rjzii
Exactamente. No se preocupe por la gran cantidad de tablas, la mayoría de ellas no se utilizan de todos modos y tal vez se eliminarán pronto. SCNR
usuario281377
Bueno, el problema es que se pueden usar todos, incluso si es solo para un único registro.
rjzii
4

Si su base de datos se puede versionar y migrar fácilmente y tiene las pruebas para demostrar que cambiar las cosas no las rompió, entonces probablemente tenga un proceso bastante ágil.

A la luz de los comentarios, generalmente en el sentido de que hay un montón de vaqueros que se justifican a sí mismos como ágiles, corren gritando. Rápido. Y publique todo lo que pueda en thedailywtf.com para que todos podamos disfrutar de su horror.

Wyatt Barnett
fuente
Lo triste es que la base de datos no se versiona, migra fácilmente y, en el mejor de los casos, hay pruebas limitadas. Los desarrolladores con frecuencia sobrescriben los cambios realizados por otros desarrolladores.
rjzii
55
Definitivamente la programación del vaquero entonces. Si tienes un equipo de gestión detrás de este esfuerzo "ágil", asegúrate de decirles a este equipo que están abusando de Agile y simplemente se están volviendo locos.
Bill Leeper
1
@RobZ Agile no es una excusa para una cobertura de prueba de unidad deficiente y un diseño de base de datos deficiente. Eso suena como un desastre caliente.
maple_shaft
2
ugh! no versionado !!! No es de extrañar que sea un desastre. Me estremezco al pensar cómo es el código de la aplicación.
ozz
44
Básicamente, este equipo no está haciendo nada ágil, son solo un equipo AdHoc. Si existe una estructura de gestión, puede plantear inquietudes de forma anónima o en persona en la cadena. Dígales que está viendo un gran desastre en la base de datos, falta de pruebas y prácticas inadecuadas que se utilizan para administrar el código. Este equipo se dirige a un gran FALLO.
Bill Leeper
3

Como la mayoría de las respuestas aquí en StackExchange, la respuesta debería ser 'depende'. En el desarrollo ágil, los requisitos y especificaciones se descubren durante la implementación.

Sin embargo, dado el desarrollo ágil, cuando un modelo relacional se normaliza adecuadamente, rara vez es necesario agregar nuevos atributos a las relaciones, las nuevas entidades generalmente deben referirse a las más antiguas, dado un modelo adecuado.

La mayoría de los desarrolladores no normalizan sus bases de datos debido a limitaciones de tiempo, pereza, incompetencia o complejidad de la consulta. Renormalizar requiere la transferencia de datos existentes, la modificación de los DAO, etc., etc., lo que genera un factor de riesgo.

Dibbeke
fuente
¿En qué punto del proceso ágil aparece mágicamente el modelo adecuado para todas las solicitudes de cambio futuras?
JeffO
Después de estudiar adecuadamente el dominio. Hay un número limitado de propiedades que definen completamente una entidad. Algunos ejemplos (cada vez más complejos): un punto 2D está completamente definido por dos coordenadas, una dirección está completamente definida por un país, una versión de campos y la realización de un conjunto de campos de direcciones definidos por otra entidad (usando una identificación de país, una versión y restricciones).
Dibbeke
@Dibbeke: Y luego tienes problemas comerciales como tratar a la UE (27 países) como un solo país en los casos X, Y y Z. O tratar a los estados de EE. UU. Como países. O la comprensión empresarial de que algunas entradas de DB tienen 2 representaciones de dirección para una sola dirección.
MSalters
3

Para responder a su pregunta, no, eso no es normal en un proceso ágil.

Donde puede parecer que se deriva de una actitud ágil es el ciclo de diseño / desarrollo / prueba de iteración corta de Agile, y el énfasis de Agile en soluciones livianas que cumplan con los requisitos conocidos, pero que estén bien estructurados para poder cumplir con los nuevos requisitos cambio mínimo Teniendo en cuenta estas dos cosas, podría decir que un desarrollador, sin saber lo que podría ocurrir en el futuro, pero sabiendo que su cambio no debería afectar a la base de datos de una manera que no se pueda deshacer, simplemente realiza los cambios necesarios en el esquema en el La forma "más ligera" posible, y luego a intervalos, varios conjuntos de cambios "ligeros" se refactorizarán en algo más permanente y estable.

Dicho esto, todavía no he trabajado con un desarrollador que se suscribió a la teoría y metodología Agile, y también pensé que, por cualquier motivo, era necesario crear y eliminar rutinariamente tablas en el esquema. Ágil no significa bofetada o atornillado. Si se le proporciona una historia que requiere la adición de un nuevo campo de datos que pertenece a un registro en particular, debe agregar el campo a la tabla. Si ese cambio rompe algo, usted descubre por qué y realiza otros cambios según sea necesario (puedo pensar en muy pocas cosas que se romperían al agregar una columna a una base de datos que se está consultando; si se rompe con este tipo de cambio, usted tener problemas mayores). La refactorización normalmente se limita al código; cambiar el esquema suele ser un proceso más complicado que cambiar el código, por lo que cuando se producen cambios en el esquema, generalmente se realizan con más cuidado, y al menos un poco de atención al conocimiento de la dirección futura del proyecto. Tener que reestructurar una parte o la totalidad de la base de datos indica una falla fundamental de diseño; ser ágil no significa que no haya un "plan maestro" de arquitectura básica y reglas de diseño a seguir mientras se construye orgánicamente el programa y la estructura de datos.

Ahora, hay casos en Agile donde lo que "sabes" ahora será contradicho por lo que aprenderás más tarde. Supongamos que tiene un requisito de que su sistema debe tener una dirección para cada persona. Como se trata de una relación 1: 1 y los datos serán necesarios en la mayoría de los casos, simplemente agregue los campos Dirección a la tabla Persona. Una semana después, recibe el requisito de que una persona pueda tener más de una dirección. Ahora es una relación 1: N, y para modelarla correctamente debe deshacer sus cambios anteriores, dividiendo los campos en una nueva tabla de direcciones. Esto no es una rutina, especialmente entre los desarrolladores senior. Un desarrollador experimentado verá que una Persona tiene una Dirección, la considerará como conceptualmente separada, y creará una tabla de Persona y una tabla de Dirección, vinculando Persona a Dirección con una referencia FK a un AddressID. Un esquema como este es más fácil de cambiar si cambia la naturaleza de la relación; sin crear o eliminar tablas de datos "anchas" enteras, la relación entre Persona y Dirección se puede modificar fácilmente de 1: 1 a 1: N a N: N.

KeithS
fuente
2

No hay tanto enfoque en el diseño por adelantado cuando se trabaja con Agile, por lo que no veo que esto sea un gran problema, ciertamente para la primera versión.

Es difícil comentar sobre un sistema que tiene 700 tablas que no he visto, puede que las necesite todas, pero también podría ser el caso de que la base de datos no se haya administrado lo suficientemente bien.

Incluso bajo ágil, para un sistema grande, es bastante común tener a alguien / equipo a cargo del esquema.

ozz
fuente
2

Si realizan cambios de este tipo con frecuencia, en particular descartar tablas y columnas en aplicaciones en vivo, parece una señal de inexperiencia. No tiene nada que ver con el proceso que afirman seguir. 'Agile' no es una excusa para no sentarse y pensar en los datos que necesita almacenar y cómo se relacionan antes de comenzar a descifrar el código. Si descubren que están alterando más del 10-20% de la estructura inicial, para mí eso es un indicador de que no están pensando bien o no tienen mucha experiencia en el análisis de requisitos y el diseño de bases de datos, por lo que simplemente obtienen Mucho de eso está mal al principio.

Gran maestro B
fuente
2

Si bien parece que su equipo es simplemente una codificación de vaquero, realmente no debería haber nada de malo en refactorizar el código O las bases de datos. No es trabajo perdido, se está adaptando a una realidad recién aprendida.

Sugeriría que lo que necesita el equipo es un entorno limitado para probar los cambios, hacer algunas pruebas, rechazarlos a los usuarios y decidir si tienen sentido. En ese punto, integrar los cambios que tienen sentido, con pruebas de regresión adecuadas, en su esquema debería estar bien.

Matthew Flynn
fuente
1

Ágil se trata de codificación, las bases de datos no son código. Cambiar una base de datos debe tratarse como remodelar una casa. La gente de alguna manera tuvo la creencia de que ágil significa actuar ahora, planear más tarde, lo cual es completamente falso. Incluso bajo métodos ágiles, se debe dar tiempo para la planificación, especialmente para algo tan importante como el diseño de bases de datos.

Ryathal
fuente
55
Las bases de datos no son código, pero el esquema es y debe tratarse como tal. Debe ser versionado y controlado por fuente también. Quiero rechazar esto, pero estoy demasiado de acuerdo con el resto de su respuesta.
maple_shaft
66
Ágil no se trata de codificación. Se trata del proceso de desarrollo de software, que definitivamente incluye bases de datos si el software de trabajo depende de la base de datos. Dicho esto, estoy de acuerdo con su afirmación de que Agile no significa 'actuar ahora, planificar más tarde'.
Eric King
@maple_shaft solo porque un esquema db se trata como código no lo convierte en código. las mascotas son tratadas como personas, pero no las convierte en personas
Ryathal
3
Ya sea que algo sea código o no, debe planificarse. El cambio de una base de datos debe tratarse como un cambio de código junto con consideraciones para los datos existentes. Realmente requiere más reflexión y planificación.
JeffO
1

Mi último trabajo fue en un equipo como este. Cuando se utiliza un proceso ágil, los requisitos cambian. A veces, los cambios significan que una entidad existente necesita un nuevo atributo que resulta en una nueva columna en una tabla existente o se requiere una entidad completamente nueva que resulta en una nueva tabla con relaciones con las tablas existentes. Este tipo de cambios viene con el territorio y no se puede ignorar solo porque no desea tocar el esquema. El éxito se determina al mantener la integridad de sus datos cuando se migra de una versión de base de datos a la siguiente y adecuada prueba unitaria.

Solo trata de no hacer cambios innecesarios en tu esquema. Por ejemplo, si una característica requiere que se cree una nueva tabla, asegúrese de estar satisfecho con la definición de esa tabla antes de incorporarla y extenderla a su entorno de prueba. Tener que deshacer un cambio en el esquema de su base de datos después de que sus datos hayan sido migrados puede ser doloroso.

Raymond Saltrelli
fuente