Comment conserver L'historique des mises à jour dans MySQL?

je dois créer un code en PHP qui me permettra de conserver l'historique des mises à jour dans la base de données MySQL pour que je puisse trouver par date une ancienne révision.

Voici l'exemple de ce que je veux réellement accomplir: http://en.wikipedia.org/w/index.php?title=Tunisia&action=history

les données sont principalement des nombres que nous enregistrons sur l'entreprise pour générer des rapports et pour extraire des indices.

je prévois d'utiliser codeigniter pour sa simplicité et Je suis à la recherche d'une idée sur un cadre ou un projet opensource qui utilise la même approche pour garder l'historique des modifications dans la base de données.

20
demandé sur Proxium 2010-03-29 13:16:08

6 réponses

la solution la plus simple (en fonction de vos besoins spécifiques) serait probablement d'ajouter un déclencheur ON update/insert/delete à votre table, de sorte que vous puissiez effectuer une journalisation supplémentaire lorsque les données sont insérées/mises à jour/supprimées. De cette façon, même les interventions manuelles sur le frein rhéostatique seront couvertes...

Case http://dev.mysql.com/doc/refman/5.1/en/triggers.html pour plus d'informations.

15
répondu wimvds 2010-03-29 09:33:46

une façon simple de garder l'historique de version est de créer fondamentalement une table identique (par ex. avec le suffixe _version). Les deux tables auraient un champ de version, qui pour la table principale vous incrémentez pour chaque mise à jour que vous faites. La table de version aurait une clé primaire composite sur (id, version).

chaque fois que vous faites une mise à jour sur la table actuelle, vous insérez également une nouvelle ligne dans la table de version avec des données dupliquées. Chaque fois que vous voulez trouver l'historique de la version, tout ce que vous devez faire est quelque chose comme SELECT * FROM content_version WHERE id = CONTENT_ID ORDER BY version.

si vous utilisez quelque chose comme Doctrine ORM, il a un comportement qui fait cela pour vous automatiquement via des écouteurs d'événements. Vous pouvez le vérifier ici: http://www.doctrine-project.org/documentation/manual/1_2/en/behaviors#core-behaviors:versionable

7
répondu reko_t 2010-03-29 09:25:20

il existe un cadre de licence en source ouverte (MIT license) pour construire des applications Web de type CRM et ERP basées sur des bases de données. Vous pouvez télécharger EPESIhttp://epe.si/ disponible également sur SourceFroge: http://sourceforge.net/projects/epesi/

EPSI's CRUD moteur Navigateur D'Enregistrement - est très performant de l'histoire ainsi que d'autres fonctionnalités comme l'avancée système d'autorisation (jusqu'à un niveau de champ) et beaucoup plus.

un seul recordset stocke les données dans pas moins de 10 tables et il est agnostique base de données (utilise PHPAdoDB). Une table appelée recordset_data stocke les données "brutes" et l'historique des modifications sont stockées dans 2 tables: recordset_edit_history et recordset_edit_history_data.

edit_history de L'enregistrement a la structure suivante:

  • l'IDENTIFIANT (clé Primaire de cette table, index)
  • Édité sur (timestamp: 2008-05-14 15:18:15)
  • Edité par: (ID utilisateur)

Edit_history_data de L'enregistrement a la structure suivante:

  • edit_id = ID à partir de l'historique d'édition
  • champ = le nom du champ qui a été changé
  • old_value = valeur du champ qui a changé.

c'est un moteur très rapide et efficace et il stocke les changements non pas sur le disque mais sur un seul niveau de champ.

6
répondu jasiek 2013-03-25 20:54:04

Vous devez utiliser une couche supplémentaire entre votre application et la base de données. Vous pouvez faire une très simple sur votre propre (au lieu de l'appel direct mysql_query vous appelez une fonction faite par vous qui l'enveloppe et qui suit les mises à jour), ou utilisez un ORM existant. En pseudo-code

my_mysql_query($query){
    if($query is an update){
        //Log stuff before query
    }
    $r = mysql_query($query);

    if ($r && $query is an update){
        //Log stuff after query
    }
    return $r;
}

puis, dans votre application, vous pouvez appeler my_mysql_query au lieu de mysql_query. Vous pouvez vérifier si le tableau est celui que vous souhaitez suivre et vous pouvez copier la ligne dans une copie de la table d'origine.

si vous utilisez Doctrine ORM, vous pouvez utiliser ses Écouteurs D'Événements pour obtenir ce que vous voulez.

2
répondu Nicolò Martini 2010-03-29 10:08:27

ce n'est pas enregistrer les mises à jour SQL réelles. Il enregistre les mises à jour des données. Il stockera en effet chaque révision de la page, et fournira simplement la dernière par défaut. Le code SQL qui a été utilisé pour cela n'a pas été stocké.

Vous devrez donc adopter une approche similaire. Chaque fois que les données changent, vous aurez besoin de travailler sur la façon dont les données ont changé et de stocker ces données 'patch'. Vous serez probablement mieux stocker la dernière version, plutôt que d'avoir à travailler à travers tous les patchs pour y arriver. Cela signifie que vous serez en mesure de voir quelque chose comme

! created file
* added data to cell D4 'product descript' D5 'set of pens' E5 '£5.99'
* added data to cell D6 'toaster' E5 '£10'
& changed data in cell D4 'Product Description'

chacun de ces changements devrait être enregistré avec un horodatage ou quand ils sont faits. Vous aurez également besoin de travailler sur votre propre scheeme pour stocker les modifications aux données.

une autre solution plus simple, serait d'utiliser un moteur wiki, qui fournit toutes les fonctionnalités que vous voulez, si vous êtes prêt à travailler sur une page web. Vous pourriez avoir besoin de passer un certain temps pour le faire fonctionner mieux pour vos besoins, en laissant les gens l'éditer à partir d'une vue plus finie, plutôt que d'un wiki brut.

1
répondu thecoshman 2010-03-29 09:28:41

si je comprends bien, vous enregistrez juste un "nombre" dans une table spécifique, et vous voulez l'historique de révision de ce nombre?

je dirais: écrivez votre datamodel de sorte qu'il contienne une histoire de ce nombre. Ainsi, non seulement vous enregistrez la dernière valeur de ce nombre, mais vous conservez aussi toutes les valeurs précédentes.

une façon simple de faire ceci est d'avoir une table avec le suivant champs:

  • id
  • companyId
  • timestamp

si vous voulez connaître le nombre actuel, faites

SELECT * FROM table WHERE companyId = X ORDER BY timestamp DESC LIMIT 1

Si vous voulez voir toutes les révisions juste à faire:

SELECT * FROM table WHERE companyId = X
1
répondu Niels Bom 2013-10-07 09:55:56