Robię coś podobnego do twojego drugiego podejścia:mam tabelę z rzeczywistym zestawem roboczym i historią ze zmianami (sygnatura czasowa, identyfikator_rekordu, identyfikator_właściwości, wartość_właściwości). Obejmuje to tworzenie rekordów. Trzecia tabela opisuje właściwości (id, nazwa_właściwości, typ_właściwości), które pomagają w konwersji danych na wyższych poziomach aplikacji. Dzięki temu możesz również bardzo łatwo śledzić zmiany pojedynczych właściwości.
Zamiast sygnatury czasowej możesz mieć również int-podobny, który zwiększasz dla każdej zmiany na record_id, dzięki czemu masz rzeczywistą wersję .