sql >> Databasteknik >  >> RDS >> Mysql

Bästa praxis för ett mysql-dataversionssystem

Mitt val skulle vara en variant av tillvägagångssätt 2. Fet anger fält i primärnyckeln.

  • Du infogar varje artikel i en tabell articles_versioned (id , tidsstämpel , namn, text)
  • Din andra tabell är articles (id , tidsstämpel, [namn, text]). Observera att tidsstämpeln inte är primär; namn och text kan replikeras, eller så kan du använda en join med articles_versioned (vilket kommer att vara snabbt eftersom id och tidsstämpel är articles_versioned primärnyckel)
  • articles_versioned har en trigger vid infogning som tar den nyss infogade raden och replikerar den på articles
  • För att återställa en specifik version av en artikel ändrar du articles tabell.

Fördelarna med detta tillvägagångssätt är:

  1. Du får gratis ytterligare information (datum och tid för artikeln) i din tabell som du kan behöva ändå
  2. Du behöver inte fråga databasen för att få det aktuella datumet. Om du använder version måste du.
  3. Din kod behöver inte infoga artikeln i två tabeller. Du infogar helt enkelt i articles_versioned och läs från articles , tar db hand om att migrera data när du infogar den via utlösaren, vilket undviker konsistensproblem.

Minus

  1. I en starkt samtidig miljö kan två versioner infogas samtidigt, så en av dem kan misslyckas. Detta borde inte vara ett problem när du infogar användarskrivna artiklar (det är högst osannolikt med tanke på exakta tidsstämplar nuförtiden). Om du inte anger tidsstämpeln i din INSERT men istället ställer du in datetime-fältet så att det har aktuell tid som standardvärde, kan du undvika det här problemet helt.

För att svara på resten av din fråga. Metod 1 kommer inte att leda till längre frågor så länge du lägger till ett index på status. Detta är bara vettigt om du tenderar att ha många olika versioner av varje artikel; så länge du har 2 versioner per artikel i genomsnitt eller mindre, kommer indexet bara att sakta ner dig, och tillvägagångssätt 2 skulle inte vara förnuftigt snabbare ändå (även om jag fortfarande skulle rekommendera mitt tillvägagångssätt eftersom det förenklar kod, eftersom återställning av en version gör det kräver inte växlingsstatus för två rader).

Relaterade resurser, som bilder, bör följa en liknande version. Jag antar att du sparar dem i filsystemet; istället för att spara dem med deras riktiga namn, använd en tabell (id , bildnamn) för att ge varje bild ett id, spara sedan bilden som -id-.jpg . Fältet image_name gör att du kan veta vad det ursprungliga filnamnet var (om du bryr dig om det). På så sätt kan du versionera bilder på samma sätt som du versionerar artiklar, och i artiklar skulle du använda något som <img src="-id-.jpg"> , som du vet kommer att förbli tillgänglig för alltid.




  1. Vad är STATISTIK TID i SQL Server?

  2. Introduktion till Oracle Databas Backup

  3. PHP MySql:Print Tree - Parent Child Checkbox

  4. Dela kommaseparerad sträng i en PL/SQL-lagrad proc