sql >> Database teknologi >  >> RDS >> Mysql

Bedste praksis for et mysql-dataversioneringssystem

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 med articles_versioned (hvilket vil være hurtigt, da id og tidsstempel er articles_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:

  1. Du får gratis endnu en information (dato og klokkeslæt for artiklen) i din tabel, som du kan få brug for alligevel
  2. Du behøver ikke at forespørge i databasen for at få den aktuelle dato. Hvis du bruger version, skal du.
  3. Din kode behøver ikke at indsætte artiklen i to tabeller. Du skal blot indsætte articles_versioned og læs fra articles , sørger db for at migrere data, efterhånden som du indsætter dem via triggeren, hvilket undgår konsistensproblemer.

Ulemper

  1. 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.




  1. Tilslut MySQL via localhost virker ikke, men 127.0.0.1 virker

  2. PostgreSQL:FATAL - Peer-godkendelse mislykkedes for bruger (PG::ConnectionBad)

  3. Entity Framework-guiden går ned på MySQL

  4. ALTER TABLE-sætningen var i konflikt med CHECK-begrænsningen i SQL Server - SQL Server / TSQL Selvstudium, del 89