Je dois garder une trace des éléments supprimés pour les besoins de synchronisation du client.
En général, est-il préférable d'ajouter une table tombstone et un déclencheur qui suit quand une ligne a été supprimée de la base de données du serveur - en gros, ajouter une nouvelle ligne à la table tombstone avec les données de l'élément supprimé - ou de conserver les éléments dans le table d'origine et les marquer comme supprimés, généralement avec une colonne de type bit, pour indiquer qu'une ligne est supprimée et une autre colonne pour suivre quand la suppression s'est produite?
Vous devriez peut-être combiner exprès les deux méthodes. Pourquoi ???
Utilisons cette table (MySQL-dialect)
Veuillez noter qu'à l'exception de la CLÉ PRIMAIRE, chaque index que vous créez doit être précédé du
deleted
drapeau et se terminant par leid
.Créons la table tombstone
Si votre table a déjà un
deleted
indicateur, vous pouvez remplir la table tommstoneOK maintenant les données et la pierre tombale sont préparées. Comment effectuez-vous des suppressions?
Supposons que vous supprimiez chaque personne du code postal 07305. Vous exécuteriez ce qui suit:
OK, cela semble être beaucoup de frais généraux de toute façon que vous le regardez.
Maintenant, voulez-vous voir toutes les données supprimées? Voici deux façons différentes:
SELECT * FROM mydata WHERE deleted=1;
SELECT B.* FROM mytomb A INNER JOIN mydata B USING (id);
Si le nombre d'identifiants dans mytomb est supérieur à 5% du nombre de lignes de mydata, il s'agit d'une analyse complète de la table. Sinon, une analyse d'index avec une recherche pour chaque ligne. Notez tous les repères à ces égards. Recherchez les plans d'explication.
Maintenant, voulez-vous voir chaque personne dans le code postal 07304? Voici deux façons différentes:
SELECT * FROM mydata WHERE deleted=1 AND zipcode='07304';
SELECT A.* FROM mydata A LEFT JOIN mytomb B USING (id) WHERE B.id IS NULL AND A.zipcode='07304'
Qu'en est-il des suppressions massives? Voici deux façons différentes:
DELETE FROM mydata WHERE deleted=1;
DELETE B.* FROM mytomb A INNER JOIN mydata B USING (id); DELETE FROM mytomb;
CONCLUSION
Maintenant, je ne dis pas de garder les deux méthodes. Faire cela au fil du temps révèle quelle méthode est la plus rapide en termes d'opérabilité globale. Vous devez décider quels repères pour interroger des données en direct, interroger des données supprimées et des suppressions massives vous conviennent le mieux.
la source