sql >> Databáze >  >> RDS >> Mysql

Historizace databáze

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:



  1. Syntaxe SQL DROP TABLE – Zobrazuje DBMS

  2. MySQL považuje ÅÄÖ za AAO?

  3. Problém s PDO bindParam

  4. Upozornění PHP:Spuštění PHP:Nelze načíst dynamickou knihovnu '/usr/lib/php/20151012/msqli.so'