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

Nejlepší postup pro systém verzování dat mysql

Moje volba by byla varianta přístupu 2. Tučným písmem jsou označena pole v primárním klíči.

  • Každý článek vložíte do tabulky articles_versioned (id , časové razítko , jméno, text)
  • Vaše druhá tabulka je articles (id , časové razítko, [jméno, text]). Všimněte si, že časové razítko není primární; jméno a text mohou být replikovány, nebo můžete použít spojení s articles_versioned (což bude rychlé, protože id a časové razítko jsou articles_versioned primární klíč)
  • articles_versioned má na vložení spouštěč, který vezme právě vložený řádek a replikuje jej na articles
  • Chcete-li obnovit konkrétní verzi článku, upravte articles stůl.

Výhody tohoto přístupu jsou:

  1. Bezplatně získáte další informace (datum a čas článku) ve vaší tabulce, které můžete stejně potřebovat
  2. Abyste získali aktuální datum, nemusíte se dotazovat na databázi. Pokud používáte verzi, musíte.
  3. Váš kód nemusí vkládat článek do dvou tabulek. Jednoduše vložíte do articles_versioned a číst z articles db se stará o migraci dat, když je vkládáte pomocí spouštěče, čímž se vyhnete problémům s konzistencí.

Nevýhody

  1. V silně souběžném prostředí mohou být vloženy dvě verze současně, takže jedna z nich může selhat. Při vkládání článků napsaných uživatelem by to neměl být problém (s ohledem na přesnost časových razítek je to v dnešní době vysoce nepravděpodobné). Pokud nezadáte časové razítko v INSERT příkazu, ale místo toho nastavíte pole datetime tak, aby mělo jako výchozí hodnotu aktuální čas, můžete se tomuto problému zcela vyhnout.

Abych odpověděl na zbytek vaší otázky. Přístup 1 nepovede k delším dotazům, pokud přidáte index stavu. To dává smysl pouze v případě, že máte tendenci mít mnoho různých verzí každého článku; pokud máte v průměru 2 verze na článek nebo méně, index vás pouze zpomalí a přístup 2 by stejně nebyl rozumně rychlejší (ačkoli bych stále doporučoval svůj přístup, protože zjednodušuje kód, protože obnovení verze ano nevyžadují stav přepínání pro dva řádky).

Související zdroje, jako jsou obrázky, by měly mít podobnou verzi. Předpokládám, že je ukládáte na souborový systém; místo jejich uložení s jejich skutečným jménem použijte tabulku (id , image_name) a každému obrázku přiřaďte ID a poté obrázek uložte jako -id-.jpg . Pole image_name vám umožní zjistit, jaký byl původní název souboru (pokud vás to zajímá). Tímto způsobem můžete upravovat obrázky stejným způsobem jako články a v článcích byste použili něco jako <img src="-id-.jpg"> , o kterém víte, že zůstane navždy k dispozici.




  1. Chyba Postgresu při aktualizaci dat sloupce

  2. Použití LogMiner k nalezení aktuálních změn

  3. VYBERTE všechny záznamy staré 30 dní

  4. vnitřní spojení a výkon klauzule where in()?