41 votes

Quelle est la meilleure façon de stocker les modifications des enregistrements de base de données qui nécessitent une approbation avant d'être visibles?

J'ai besoin de stocker des modifications entrée d'une table en particulier, mais non pas à montrer les modifications jusqu'à ce qu'ils ont été vu et approuvé par un utilisateur administratif. Alors que ces changements sont encore dans un état d'attente, je serais encore à l'ancienne version des données. Quelle serait la meilleure façon de les stocker ces modifications sont en attente d'approbation?

J'ai pensé à plusieurs égards, mais ne peut pas comprendre quelle est la meilleure méthode. C'est une très petite application web. Un autre moyen serait d'avoir un PendingChanges tableau qui imite l'autre schéma de tableau, et puis une fois que le changement est approuvé, j'ai pu mettre à jour le véritable table avec les informations. Une autre approche serait de faire une sorte de record de gestion des versions où je stocker plusieurs versions des données dans la table, puis extraire le dossier avec le plus grand numéro de version qui a été marquée approuvé. Qui permettrait de limiter le nombre de tables supplémentaires (j'en ai besoin pour ce faire de plusieurs tables), mais m'obligerait à faire un traitement supplémentaire à chaque fois que je sors un ensemble d'enregistrements assurez-je obtenir les bonnes.

Toutes les expériences personnelles avec ces méthodes, ou d'autres qui pourraient être bon?

Mise à jour: Juste pour préciser, dans cette situation particulière, je ne m'intéresse pas tellement dans les données historiques. J'ai juste besoin d'une certaine manière à l'approbation de toutes les modifications qui sont faites par un utilisateur avant d'aller vivre sur le site. Ainsi, un utilisateur de modifier leur "profil", puis un administrateur de regarder cette modification, et de l'approuver. Une fois approuvé, qui deviendra la valeur affichée et l'ancienne version n'a pas besoin d'être conservés.

Quelqu'un a essayé la solution ci-dessous où vous stockez les modifications en attente d'une table qui doit les suivre en tant que XML dans un PendingChanges table? Chaque enregistrement aurait une colonne qui dit la table dans laquelle les modifications ont pour, une colonne qui peut être stockée à l'id de l'enregistrement qui serait modifié (null si c'est un nouveau record), une colonne datetime pour stocker lorsque le changement a été fait, et une colonne pour stocker le xml de l'enregistrement modifié (peut-sérialiser mon objet de données). Comme je n'ai pas besoin de l'histoire, après qu'une modification a été approuvée, le réel, le tableau sera mis à jour et le PendingChange de l'enregistrement peut être supprimé.

Toutes les pensées sur cette méthode?

21voto

nsayer Points 5594

Stockez-les définitivement dans le tableau principal avec une colonne pour indiquer si les données sont approuvées ou non.

Une fois la modification approuvée, aucune copie n'est requise. Le travail supplémentaire pour filtrer les données non approuvées est le genre de chose que les bases de données sont censées faire, quand on y pense. Si vous indexez la colonne approuvée, cela ne devrait pas être trop contraignant pour faire la bonne chose.

10voto

Tom Carr Points 733

La taille est votre ennemi. Si vous traitez avec beaucoup de données et d'un grand nombre de lignes, puis d'avoir l'historique mélangé avec le courant sera de marteau vous. Vous aurez également des problèmes si vous vous joignez à d'autres données à vérifier que vous avez le droit de lignes.

Si vous avez besoin d'enregistrer les données historiques pour montrer les changements au fil du temps, j'irais avec le historique, le tableau que les mises à jour de la vivre, de vraies données une fois qu'il est approuvé. C'est juste tout autour de nettoyant.

Si vous avez beaucoup de types de données qui ont ce mécanisme, mais n'avez pas besoin de garder un historique, je voudrais suggérer une file d'attente commune talbe pour l'examen des points en suspens, dire stockées au format xml. Cela permettrait une seule table pour être lu par les administrateurs, et vous permettent d'ajouter cette fonctionnalité à n'importe quelle table dans votre système assez facilement.

5voto

Vivek Kodira Points 510

Je travaille dans un domaine bancaire et nous avons ce besoin - que les modifications faites par un utilisateur ne doit être réfléchi, après avoir été approuvés par un autre. La conception que nous utilisons est comme ci-dessous

  1. Le Tableau Principal D'Un
  2. Un autre Tableau B qui stocke l'enregistrement modifié (et donc, est exactement semblable à la première) + 2 colonnes supplémentaires (un FKey à C et un code pour indiquer le type de changement)
  3. Un troisième tableau C qui stocke tous ces enregistrements qui ont besoin de l'approbation
  4. Un quatrième tableau D qui stocke l'histoire (vous n'avez probablement pas besoin de cela).

Je recommande cette approche. Il gère tous les scénarios, y compris les mises à jour et les suppressions de très gracieusement.

4voto

stephenbayer Points 5548

Compte tenu de la conformité SOx mouvement qui a été poussé dans le visage de la plupart des sociétés cotées en bourse, j'ai eu un peu d'expérience dans ce domaine. Généralement, j'ai été en utilisant une table séparée avec un horodatage des modifications en attente avec une sorte de drapeau de la colonne. La personne en charge de l'administration de ces données permet d'obtenir une liste des changements à venir et vous pouvez choisir d'accepter ou ne pas accepter. Quand un morceau de données est accepté, j'ai utiliser des déclencheurs pour intégrer les nouvelles données dans la table. Bien que certaines personnes n'aiment pas le déclencheur de la méthode et serait plutôt le code présent dans le stockés procs. Cela a bien fonctionné pour moi, même dans de grandes bases de données. La complexité peut être un peu difficile de traiter avec, en particulier face à une situation où un changement entre directement en conflit avec un autre changement, et ce afin de traiter ces changements. La table contenant les données de la demande ne peut jamais être en mesure d'être supprimé, car il détient la "miettes de pain" façon de parler qui sont requis dans les cas où il est nécessaire de remonter la trace de ce qui s'est passé dans une situation particulière. Mais dans toute approche, les risques doivent être évalués, comme ce que j'ai évoqué avec les données contradictoires, et une couche de logique métier doit être mis en place afin de déterminer les processus dans ces situations.

Personnellement, je n'aime pas de la même table de la méthode, parce que dans le cas de banques de données qui sont constamment modifié, ce supplément de données dans une table peut inutilement la tourbière de la baisse de la demande sur la table, et aurait besoin de beaucoup plus de détails à la façon dont vous l'indexation de la table et de vos plans d'exécution.

2voto

borjab Points 1839

Je créerais une table avec un drapeau et créerais une vue comme

  CREATE OR REPLACE VIEW AS 

  SELECT * FROM my_table where approved = 1
 

Cela peut aider à séparer les dépendances entre le protocole et les requêtes. Mais ce n'est peut-être pas la meilleure idée si vous avez besoin de mettre à jour la vue.

Le déplacement d'enregistrements peut avoir des considérations de performances. Mais les tables partitionnées pourraient faire quelque chose de très similaire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X