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í sarticles_versioned
(což bude rychlé, protože id a časové razítko jsouarticles_versioned
primární klíč) articles_versioned
má na vložení spouštěč, který vezme právě vložený řádek a replikuje jej naarticles
- Chcete-li obnovit konkrétní verzi článku, upravte
articles
stůl.
Výhody tohoto přístupu jsou:
- Bezplatně získáte další informace (datum a čas článku) ve vaší tabulce, které můžete stejně potřebovat
- Abyste získali aktuální datum, nemusíte se dotazovat na databázi. Pokud používáte verzi, musíte.
- Váš kód nemusí vkládat článek do dvou tabulek. Jednoduše vložíte do
articles_versioned
a číst zarticles
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
- 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.