Pregunta ¿Utiliza control de fuente para sus elementos de base de datos? [cerrado]


Siento que mi tienda tiene un agujero porque no tenemos un proceso sólido para versionar los cambios de nuestro esquema de base de datos. Hacemos muchas copias de seguridad por lo que estamos más o menos cubiertos, pero es una mala práctica confiar en su última línea de defensa de esta manera.

Sorprendentemente, esto parece ser un hilo común. Muchas tiendas con las que he hablado ignoran este problema porque sus bases de datos no cambian con frecuencia, y básicamente intentan ser meticulosas.

Sin embargo, sé cómo va esa historia. Solo es cuestión de tiempo que las cosas se alineen de forma incorrecta y que algo se pierda.

¿Hay alguna mejor práctica para esto? ¿Cuáles son algunas estrategias que te han funcionado?


559


origen


Respuestas:


Debe leer Obtenga su base de datos bajo control de versiones. Verifique la serie de publicaciones de K. Scott Allen.

Cuando se trata de control de versiones, la base de datos suele ser un segundo o incluso un ciudadano de tercera clase. Por lo que he visto, los equipos que nunca pensarían en escribir código sin control de versión en un millón de años, y con razón, de alguna manera pueden ser completamente ajenos a la necesidad de controlar las bases de datos críticas en las que confían sus aplicaciones. No sé cómo puede llamarse a sí mismo un ingeniero de software y mantener una cara dura cuando su base de datos no está exactamente bajo el mismo nivel riguroso de control de la fuente que el resto de su código. No dejes que esto te pase a ti. Obtenga su base de datos bajo control de versión.


365



Las bases de datos en sí? No

Los scripts que los crean, incluidos los insertos de datos estáticos, los procedimientos almacenados y similares; por supuesto. Son archivos de texto, están incluidos en el proyecto y se registran como todo lo demás.

Por supuesto, en un mundo ideal, su herramienta de administración de bases de datos haría esto; pero solo debes ser disciplinado al respecto.


129



Me encantan las migraciones de Rails ActiveRecord. Resume el script DML a ruby, que luego puede ser fácilmente versionado en su repositorio de origen.

Sin embargo, con un poco de trabajo, podrías hacer lo mismo. Cualquier cambio de DDL (ALTER TABLE, etc.) se puede almacenar en archivos de texto. Mantenga un sistema de numeración (o un sello de fecha) para los nombres de los archivos y aplíquelos en secuencia.

Rails también tiene una tabla de 'versión' en el DB que realiza un seguimiento de la última migración aplicada. Puedes hacer lo mismo fácilmente.


34



Revisa LiquiBase para gestionar cambios en la base de datos usando el control de fuente.


32



Nunca debe simplemente iniciar sesión y comenzar a ingresar los comandos "ALTER TABLE" para cambiar una base de datos de producción. El proyecto en el que estoy tiene una base de datos en cada sitio del cliente, por lo que cada cambio a la base de datos se realiza en dos lugares, un archivo de volcado que se utiliza para crear una nueva base de datos en un nuevo sitio del cliente y un archivo de actualización que se ejecuta en cada actualización que verifique su número actual de versión de la base de datos con el número más alto en el archivo, y actualice su base de datos en su lugar. Entonces, por ejemplo, las últimas dos actualizaciones:

if [ $VERSION \< '8.0.108' ] ; then
  psql -U cosuser $dbName << EOF8.0.108
    BEGIN TRANSACTION;
    --
    -- Remove foreign key that shouldn't have been there.
    -- PCR:35665
    --
    ALTER TABLE     migratorjobitems
    DROP CONSTRAINT migratorjobitems_destcmaid_fkey;
    -- 
    -- Increment the version
    UPDATE          sys_info
    SET             value = '8.0.108'
    WHERE           key = 'DB VERSION';
    END TRANSACTION;
EOF8.0.108
fi

if [ $VERSION \< '8.0.109' ] ; then
  psql -U cosuser $dbName << EOF8.0.109
    BEGIN TRANSACTION;
    --
    -- I missed a couple of cases when I changed the legacy playlist
    -- from reporting showplaylistidnum to playlistidnum
    --
    ALTER TABLE     featureidrequestkdcs
    DROP CONSTRAINT featureidrequestkdcs_cosfeatureid_fkey;
    ALTER TABLE     featureidrequestkdcs
    ADD CONSTRAINT  featureidrequestkdcs_cosfeatureid_fkey
    FOREIGN KEY     (cosfeatureid)
    REFERENCES      playlist(playlistidnum)
    ON DELETE       CASCADE;
    --
    ALTER TABLE     ticket_system_ids
    DROP CONSTRAINT ticket_system_ids_showplaylistidnum_fkey;
    ALTER TABLE     ticket_system_ids
    RENAME          showplaylistidnum
    TO              playlistidnum;
    ALTER TABLE     ticket_system_ids
    ADD CONSTRAINT  ticket_system_ids_playlistidnum_fkey
    FOREIGN KEY     (playlistidnum)
    REFERENCES      playlist(playlistidnum)
    ON DELETE       CASCADE;
    -- 
    -- Increment the version
    UPDATE          sys_info
    SET             value = '8.0.109'
    WHERE           key = 'DB VERSION';
    END TRANSACTION;
EOF8.0.109
fi

Estoy seguro de que hay una mejor manera de hacerlo, pero hasta ahora me ha funcionado.


29



Sí. El código es código. Mi regla de oro es que necesito ser capaz de construir y desplegar la aplicación desde cero, sin mirar una máquina de desarrollo o producción.


15



La mejor práctica que he visto es crear un script de compilación para eliminar y reconstruir su base de datos en un servidor intermedio. A cada iteración se le asignó una carpeta para cambios en la base de datos, todos los cambios fueron escritos con "Dejar ... Crear". De esta forma puede retroceder a una versión anterior en cualquier momento apuntando la compilación a la carpeta a la que desea hacer la versión.

Creo que esto se hizo con NaNt / CruiseControl.


14



SÍ, creo que es importante versionar su base de datos. No los datos, pero el esquema es seguro.

En Ruby On Rails, esto es manejado por el marco con "migraciones". Cada vez que modifica el archivo db, crea un script que aplica los cambios y lo controla en el control de código fuente.

A mi tienda le gustó tanto esa idea que añadimos la funcionalidad a nuestra versión basada en Java usando scripts de shell y Ant. Integramos el proceso en nuestra rutina de implementación. Sería bastante fácil escribir scripts para hacer lo mismo en otros marcos que no son compatibles con las versiones de DB desde el primer momento.


11