2009-03-12 28 views
8

Actualmente estoy trabajando en un sistema de revisión simple que me permite almacenar varias versiones de un único archivo, que funciona bien hasta el momento.¿Cuál es la mejor manera de crear un sistema de revisión simple usando MySQL?

Estructura de la tabla es el siguiente (columnas obsoletos omitidas por motivos de brevedad):

file_id  file_revision  file_parent  file_name 
-------------------------------------------------------- 
1   1     0    foo.jpg 
2   2     1    foorevised.jpg     
3   3     1    anotherrevision.jpg 

Donde:

  • file_id es la clave primaria, que auto incrementos
  • file_revision almacena el número de revisión, por defecto a 1 cuando es el primero
  • file_parent es el principal padre de la revisión, por defecto al 0 cuando primero.
  • file_name siendo el nombre del archivo.

El problema:

  • preferiblemente utilizando una única consulta Quiero recuperar todos los archivos ...
  • Pero sólo la última revisión de cada archivo ...
  • .. cuando solo se almacena una revisión (original), esta debe ser recuperada.

Cualquier apuntador es muy apreciado. Gracias por adelantado.

+0

No veo por qué esto fue votado negativamente, creo que es una pregunta legítima, me gustaría saber la respuesta. –

Respuesta

3

La manera más eficiente para recuperar es agregar una columna como is_latest que necesita rellenar de antemano, luego select * from table where file_id=1 and is_latest=true cuando desee obtener la última versión del archivo 1. Obviamente, esto hará que actualice esta tabla más complicado, sin embargo.

Otra forma de hacerlo sería almacenar las últimas versiones de los archivos en una tabla, y las versiones históricas en otra tabla. Si desea seleccionar predominantemente todos los archivos que son la última versión, select * from table where is_latest=true podría equivaler a una exploración de tabla completa, incluso si is_latest está indexado. Si las últimas filas estaban todas en una tabla, la base de datos puede leerlas todas en IO secuencial y no tiene que hacer 1) hacer muchas búsquedas en la tabla para encontrar solo los registros que necesita o 2) escanear toda la tabla descartando grandes cantidades de datos en el camino para los registros anteriores.

Suponiendo que usted no desea cambiar el diseño de la tabla existente, lo que quiere hacer es llamada seleccionando la máxima GroupWise, consulte this article de varias maneras diferentes de hacerlo en MySQL.

+0

Me doy cuenta de que esta es una respuesta muy antigua, pero seguramente una verificación de fecha y hora sería más simple, más fácil y más eficiente. No necesita actualizar la última revisión para eliminar el indicador is_latest, y al seleccionar simplemente seleccionaría 1 y ordenaría por timestamp. – Sk446

1
file_id  file_revised  file_name    Time_Stamp 
----------------------------------------------------------------- 
1   1     foo.jpg     insert_time 
2   1     foorevised.jpg   insert_time     
3   1     anotherrevision.jpg  insert_time 

me permitiría hacer variaciones en las consultas como esta:

SELECT * DONDE file_revision = 1 ORDER BY TIME_STAMP GROUP BY file_revision

O cualquier cualquier cantidad de variación de este tipo de consulta, es decir, límite 1 o pedido por archivo_id como el más alto también será el más reciente, etc.

Cuestiones relacionadas