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

Conserver l'historique des changements de page. Un peu comme le fait SO pour les révisions

Bonjour, je travaille actuellement sur une solution à un problème similaire, je le résous en divisant mes tables en deux, une table de contrôle et une table de données. La table de contrôle contiendra une clé primaire et une référence dans la table de données, la table de données contiendra une clé de révision à incrémentation automatique et la clé primaire de la table de contrôle comme clé étrangère.

en prenant votre table d'entrées comme exemple

Entries Table
+----+-------+------+--------+--------+
| id | title | text | index1 | index2 |
+----+-------+------+--------+--------+

devient

entries             entries_data
+----+----------+   +----------+----+--------+------+--------+--------+
| id | revision |   | revision | id |  title | text | index1 | index2 |
+----+----------+   +----------+----+--------+------+--------+--------+

interroger

select * from entries join entries_data on entries.revision = entries_data.revision;

au lieu de mettre à jour la table des entrées_données, vous utilisez une instruction d'insertion, puis mettez à jour la révision de la table des entrées avec la nouvelle révision de la table des entrées.

L'avantage de ce système est que vous pouvez passer à différentes révisions simplement en modifiant la propriété de révision dans le tableau des entrées. L'inconvénient est que vous devez mettre à jour vos requêtes. J'intègre actuellement cela dans une couche ORM afin que les développeurs n'aient de toute façon pas à se soucier d'écrire du SQL. Une autre idée avec laquelle je joue est qu'il y ait une table de révision centralisée que toutes les tables de données utilisent. Cela vous permettrait de décrire l'état de la base de données avec un seul numéro de révision, similaire au fonctionnement des numéros de révision subversion.