Mysql
 sql >> Base de données >  >> RDS >> Mysql

L'id ou l'horodatage doit-il être utilisé pour déterminer l'ordre de création des lignes dans une table de base de données ? (compte tenu de la possibilité d'une horloge système mal réglée)

Utilisation de l'id séquentiel serait plus simple car il s'agit probablement (?) D'une clé primaire et donc indexée et plus rapide d'accès. Étant donné que vous avez user_id , vous pouvez rapidement affirmer les dernières modifications et les précédentes.

Utilisation de l'timestamp est également applicable, mais il s'agira probablement d'une entrée plus longue, et nous ne savons pas du tout si elle est indexée, plus le risque de collisions. Vous soulignez à juste titre que les horloges système peuvent changer... Alors que séquentiel id ne peut pas.

Compte tenu de votre mise à jour :

Comme il est difficile de voir quelles sont vos exigences exactes, j'ai inclus ceci comme preuve de ce qu'un projet particulier nécessitait pour plus de 200 000 documents complexes et des millions de révisions.

De ma propre expérience (construction d'un système de doc/profilage entièrement auditable) pour une équipe interne de plus de 60 chercheurs à temps plein. Nous avons fini par utiliser à la fois un id et un certain nombre d'autres champs (y compris timestamp ) pour fournir une piste d'audit et une gestion complète des versions.

Le système que nous avons construit a plus de 200 champs pour chaque profil et donc la gestion des versions d'un document était bien plus complexe que le simple stockage d'un bloc de texte/contenu modifié pour chacun; Pourtant, chaque profil peut être modifié, approuvé, rejeté, annulé, publié et même exporté au format PDF ou dans un autre format en tant que document UNIQUE.

Ce que nous avons fini par faire (après beaucoup de stratégie/planification) était de stocker des versions séquentielles du profil, mais elles étaient clé principalement sur un id champ .

Horodatages

Les horodatages ont également été capturés en tant que vérification secondaire et nous nous sommes assurés de maintenir la précision des horloges système (parmi un groupe de serveurs) grâce à l'utilisation de scripts cron qui vérifiaient régulièrement l'alignement temporel et les corrigeaient si nécessaire. Nous avons également utilisé Ntpd pour éviter la dérive de l'horloge.

Autres données capturées

D'autres données capturées pour chaque modification incluent également (mais sans s'y limiter) :

User_id
User_group
Action
Approval_id

Il y avait aussi d'autres tableaux qui remplissaient les exigences internes (y compris les annotations générées automatiquement pour les documents) - car une partie de l'édition du profil a été effectuée à l'aide de données provenant de robots (construits à l'aide de NER/machine learning/AI), mais avec l'approbation requise par l'un des l'équipe avant que les modifications/mises à jour puissent être publiées.

Un journal des actions a également été conservé pour toutes les actions des utilisateurs, de sorte qu'en cas d'audit, on puisse consulter les actions d'un utilisateur individuel - même lorsqu'il n'avait pas les autorisations pour effectuer une telle action, elle était toujours enregistrée. .

En ce qui concerne la migration, je ne vois pas cela comme un gros problème, car vous pouvez facilement conserver les séquences d'identification lors du déplacement/vidage/transfert des données. Peut-être que le seul problème était de savoir si vous deviez fusionner des ensembles de données. Vous pouvez toujours écrire un script de migration dans ce cas - donc d'un point de vue personnel, je considère que cet inconvénient est quelque peu atténué.

Il peut être intéressant de regarder les structures de table Stack Overflow pour leur explorateur de données (qui est raisonnablement sophistiqué). Vous pouvez voir la structure du tableau ici :https://data.stackexchange.com/stackoverflow/query /nouveau , qui provient d'une question sur meta :Comment SO stocke-t-il révisions ?

En tant que système de révision, SO fonctionne bien et la fonctionnalité de démarquage/révision est probablement un bon exemple à retenir.