sql >> Base de Datos >  >> RDS >> Mysql

Mejores prácticas para un sistema de control de versiones de datos mysql

Mi elección sería una variación del enfoque 2. La negrita indica campos en la clave principal.

  • Insertas cada artículo en una tabla articles_versioned (id , marca de tiempo , nombre, texto)
  • Tu segunda tabla es articles (id , marca de tiempo, [nombre, texto]). Tenga en cuenta cómo la marca de tiempo no es primaria; el nombre y el texto pueden replicarse, o puede usar una unión con articles_versioned (que será rápido ya que la identificación y la marca de tiempo son articles_versioned clave principal)
  • articles_versioned tiene un activador al insertar que toma la fila recién insertada y la replica en articles
  • Para restaurar una versión específica de un artículo, modifique los articles mesa.

Las ventajas de este enfoque son:

  1. Obtiene de forma gratuita otra información (la fecha y la hora del artículo) en su tabla, que puede necesitar de todos modos
  2. No necesita consultar la base de datos para obtener la fecha actual. Si usa la versión, tiene que hacerlo.
  3. Su código no tiene que insertar el artículo en dos tablas. Simplemente inserte en articles_versioned y leer de articles , la base de datos se encarga de migrar los datos a medida que los inserta a través del activador, evitando cualquier problema de coherencia.

Contras

  1. En un entorno muy concurrente, es posible que se inserten dos versiones al mismo tiempo, por lo que una de ellas puede fallar. Esto no debería ser un problema al insertar artículos escritos por usuarios (es muy poco probable dada la precisión de las marcas de tiempo en estos días). Si no especifica la marca de tiempo en su INSERT declaración, pero en su lugar configura el campo de fecha y hora para que tenga la hora actual como valor predeterminado, puede evitar este problema por completo.

Para responder al resto de tu pregunta. El enfoque 1 no conducirá a consultas más largas siempre que agregue un índice sobre el estado. Esto tiene sentido solo si tiende a tener muchas versiones diferentes de cada artículo; siempre que tenga 2 versiones por artículo en promedio o menos, el índice solo lo ralentizará, y el enfoque 2 no sería sensiblemente más rápido de todos modos (aunque aún recomendaría mi enfoque porque simplifica el código, ya que restaurar una versión no no requiere estado de cambio para dos filas).

Los recursos relacionados, como las imágenes, deben seguir un control de versiones similar. Supongo que los está guardando en el sistema de archivos; en lugar de guardarlos con su nombre real, use una tabla (id , image_name) para darle a cada imagen una identificación, luego guarde la imagen como -id-.jpg . El campo image_name le permitirá saber cuál era el nombre del archivo original (si le importa). De esta manera, puede versionar las imágenes de la misma manera que versiona los artículos, y en los artículos usaría algo como <img src="-id-.jpg"> , que sabes que permanecerá disponible para siempre.