Mit valg ville være en variation af tilgang 2. Fed angiver felter i den primære nøgle.
- Du indsætter hver artikel i en tabel
articles_versioned
(id , tidsstempel , navn, tekst) - Din anden tabel er
articles
(id , tidsstempel, [navn, tekst]). Bemærk, hvordan tidsstemplet ikke er primært; navn og tekst kan replikeres, eller du kan bruge en joinforbindelse medarticles_versioned
(hvilket vil være hurtigt, da id og tidsstempel erarticles_versioned
primær nøgle) articles_versioned
har en trigger ved indsættelse, der tager den netop indsatte række og replikerer den påarticles
- For at gendanne en specifik version af en artikel, ændrer du
articles
tabel.
Fordelene ved denne tilgang er:
- Du får gratis endnu en information (dato og klokkeslæt for artiklen) i din tabel, som du kan få brug for alligevel
- Du behøver ikke at forespørge i databasen for at få den aktuelle dato. Hvis du bruger version, skal du.
- Din kode behøver ikke at indsætte artiklen i to tabeller. Du skal blot indsætte
articles_versioned
og læs fraarticles
, sørger db for at migrere data, efterhånden som du indsætter dem via triggeren, hvilket undgår konsistensproblemer.
Ulemper
- I et stærkt samtidige miljø kan to versioner indsættes på samme tid, så en af dem kan mislykkes. Dette burde ikke være et problem, når du indsætter brugerskrevne artikler (det er højst usandsynligt givet præcision af tidsstempler i disse dage). Hvis du ikke angiver tidsstemplet i din
INSERT
sætning, men i stedet indstiller du datetime-feltet til at have det aktuelle klokkeslæt som standardværdi, kan du helt undgå dette problem.
For at besvare resten af dit spørgsmål. Fremgangsmåde 1 vil ikke føre til længere forespørgsler, så længe du tilføjer et indeks på status. Dette giver kun mening, hvis du har tendens til at have mange forskellige versioner af hver artikel; så længe du har 2 versioner pr. artikel i gennemsnit eller mindre, vil indekset kun gøre dig langsommere, og tilgang 2 ville alligevel ikke være fornuftigt hurtigere (selv om jeg stadig vil anbefale min tilgang, fordi den simpelthen gør kode, da gendannelse af en version gør kræver ikke skiftestatus for to rækker).
Relaterede ressourcer, som billeder, bør følge en lignende versionering. Jeg går ud fra, at du gemmer dem på filsystemet; i stedet for at gemme dem med deres rigtige navn, brug en tabel (id , image_name) for at give hvert billede et id, og gem derefter billedet som -id-.jpg
. Billednavn-feltet vil gøre dig i stand til at vide, hvad det originale filnavn var (hvis du bekymrer dig om det). På denne måde kan du versionere billeder på samme måde som du versionerer artikler, og i artikler vil du bruge noget som <img src="-id-.jpg">
, som du ved vil forblive tilgængelig for evigt.