sql >> Databasteknik >  >> RDS >> Mysql

Bör id eller tidsstämpel användas för att bestämma skapandeordningen för rader i en databastabell? (gis möjlighet till felaktigt inställd systemklocka)

Använder det sekventiella id skulle vara enklare eftersom det förmodligen(?) är en primärnyckel och därmed indexerad och snabbare att komma åt. Med tanke på att du har user_id , kan du snabbt fastställa de senaste och tidigare redigeringarna.

Använda timestamp är också tillämpligt, men det är sannolikt en längre post, och vi vet inte om det är indexerat alls, plus risken för kollisioner. Du påpekar med rätta att systemklockorna kan ändras... Medan sekventiell id s kan inte.

Med tanke på din uppdatering:

Eftersom det är svårt att se vad dina exakta krav är, har jag tagit med detta som bevis på vad ett visst projekt krävde för över 200 000 komplexa dokument och miljontals revisioner.

Av min egen erfarenhet (att bygga ett helt revisionsbart dokument/profileringssystem) för ett internt team på mer än 60 heltidsanställda forskare. Det slutade med att vi använde både ett id och ett antal andra fält (inklusive timestamp ) för att tillhandahålla audit-trailing och fullständig versionshantering.

Systemet vi byggde har mer än 200 fält för varje profil och därför var versioneringen av ett dokument mycket mer komplex än att bara lagra ett block med ändrad text/innehåll för var och en; Ändå kan varje profil redigeras, godkännas, avvisas, återställas, publiceras och till och med exporteras som antingen en PDF eller annat format som ETT dokument.

Det vi slutade med (efter mycket strategi/planering) var att lagra sekventiella versioner av profilen, men de var nyckelade i första hand på ett id fält .

Tidsstämplar

Tidsstämplar registrerades också som en sekundär kontroll och vi såg till att hålla systemklockorna korrekta (blandat ett kluster av servrar) genom att använda cron-skript som kontrollerade tidsanpassningen regelbundet och korrigerade dem vid behov. Vi använde också Ntpd för att förhindra klockdrift.

Annan insamlad data

Andra data som samlats in för varje redigering inkluderade också (men inte begränsat till):

User_id
User_group
Action
Approval_id

Det fanns också andra tabeller som uppfyllde interna krav (inklusive automatiskt genererade kommentarer för dokumenten) - eftersom en del av profilredigeringen gjordes med hjälp av data från bots (byggd med NER/maskininlärning/AI), men med godkännande som krävs av någon av teamet innan redigeringar/uppdateringar kunde publiceras.

En åtgärdslogg fördes också över alla användaråtgärder, så att man vid en revision kunde titta på en enskild användares handlingar - även när de inte hade behörighet att utföra en sådan åtgärd loggades den fortfarande .

När det gäller migrering ser jag det inte som ett stort problem, då man enkelt kan bevara id-sekvenserna i att flytta/dumpa/överföra data. Kanske det enda problemet är om du behövde slå samman datamängder. Du kan alltid skriva ett migreringsmanus i den händelsen - så ur ett personligt perspektiv anser jag att den nackdelen är något minskad.

Det kan vara värt att titta på Stack Overflow-tabellstrukturerna för datautforskaren (som är ganska sofistikerad). Du kan se tabellstrukturen här:https://data.stackexchange.com/stackoverflow/query /ny , som kommer från en fråga om meta:How does SO store revisioner?

Som revisionssystem fungerar SO bra och markdown/revision-funktionen är förmodligen ett bra exempel att välja på.



  1. MySQL utelämnar rader som en användare redan har sett från att kontrollera en sett tabell

  2. Rails:Tvinga tom sträng till NULL i databasen

  3. Effektivitet av kvartalsberäkning av personalstyrka

  4. Fråga föräldrar och barn i självrefererande tabell