Вариант в лоб: просто хранишь в базе/на диске документы всех версий и обращаешься к ним по надобности.
Однако об оптимизации пространства тут, конечно, речи не идёт.
Вариант хитрый: создаётся базовый документ. При каждом изменении версии сохраняется новая версия как базовая, а отдельно хранится дельта - отличие новой от предыдущей. По умолчанию загружается всегда последняя. Если нужно более раннюю, пробегаешься по всем итерациям дельт до нужно версии, на лету внося изменения в данные для показа и потом отображаешь их пользователю.