Hay una serie de opciones; el más simple, por supuesto, es simplemente registrar todas las versiones de forma independiente. Para un sitio como stackoverflow, donde las publicaciones generalmente no se editan muchas veces, esto es apropiado. Sin embargo, para algo como wikipedia, uno necesita ser más inteligente para ahorrar espacio.
En el caso de la wikipedia, las páginas se almacenan inicialmente con cada versión por separado, en el text table. Periódicamente, varias revisiones antiguas se comprimen juntas, luego se empaquetan en un solo campo. Como habrá mucha repetición, ahorrará mucho espacio de esta manera.
Es posible que también desee ver cómo lo hacen algunos sistemas de control de versiones; por ejemplo, subversion usa skip deltas, donde las revisiones se almacenan como una diferencia de una revisión a la mitad del historial. Esto significa que habrá que examinar como máximo O (lg n) revisiones para reconstruir la revisión de interés.
Git, por otro lado, utiliza algo más similar al enfoque de wikipedia. Las revisiones se almacenan como objetos 'sueltos' individualmente comprimidos al principio, luego periódicamente git toma todos los objetos sueltos, los ordena de acuerdo con una heurística algo compleja, luego construye deltas comprimidos entre objetos 'cercanos' y vuelca el resultado como packfile. La cantidad de revisiones que deben leerse para reconstruir un archivo está limitada por un argumento para el proceso de creación del paquete. Esto tiene la propiedad interesante de que los deltas se pueden construir entre objetos que no están relacionados, en algunos casos.
+1 buena pregunta –