Zde je jeden způsob, jak to udělat:
V zásadě nikdy neupravujeme ani nemažeme existující data. „Upravujeme“ ji vytvořením nové verze. „Smažeme“ nastavením příznaku DELETED.
Například:
- Pokud produkt změní cenu, vložíme nový řádek do PRODUCT_VERSION, zatímco staré objednávky zůstanou propojeny se starou PRODUCT_VERSION a starou cenou.
- Když kupující změní adresu, jednoduše vložíme nový řádek do CUSTOMER_VERSION a propojíme s ním nové objednávky, přičemž staré objednávky zůstanou propojené se starou verzí.
- Pokud je produkt smazán, ve skutečnosti jej nesmažeme – jednoduše nastavíme příznak PRODUCT.DELETED, takže všechny objednávky, které byly pro daný produkt v minulosti provedeny, zůstanou v databázi.
- Pokud je zákazník smazán (např. proto, že požádal o zrušení registrace), nastavte příznak CUSTOMER.DELETED.
Upozornění:
- Pokud musí být název produktu jedinečný, nelze to ve výše uvedeném modelu deklarativně vynutit. Buď budete muset „propagovat“ NÁZEV z PRODUCT_VERSION na PRODUCT, udělat z něj klíč a vzdát se možnosti „vyvíjet“ název produktu, nebo vynutit jedinečnost pouze u nejnovější verze PRODUCT_VER (pravděpodobně prostřednictvím spouštěčů).
- Existuje potenciální problém se soukromím zákazníka. Pokud je zákazník vymazán ze systému, může být žádoucí fyzicky odstranit jeho data z databáze a pouhé nastavení CUSTOMER.DELETED to neudělá. Pokud je to problém, buď vymažte data citlivá na ochranu soukromí ve všech verzích zákazníka, nebo případně odpojte existující objednávky od skutečného zákazníka a znovu je připojte ke speciálnímu „anonymnímu“ zákazníkovi a poté fyzicky odstraňte všechny zákaznické verze.
Tento model využívá mnoho identifikačních vztahů. To vede k "tlustým" cizím klíčům a může to být trochu problém s úložištěm, protože MySQL nepodporuje špičkovou kompresi indexů (na rozdíl například od Oracle), ale na druhou stranu InnoDB vždy shlukuje data na PK a toto shlukování může být přínosné pro výkon. Také JOINy jsou méně nutné.
Ekvivalentní model s neidentifikujícími vztahy a náhradními klíči by vypadal takto: