Base de données: pour supprimer ou ne pas supprimer des enregistrements

117

Je ne pense pas être la seule personne à s'interroger à ce sujet. Que pratiquez-vous habituellement sur le comportement des bases de données? Préférez-vous supprimer physiquement un enregistrement de la base de données? Ou est-il préférable de simplement marquer l'enregistrement avec un indicateur «supprimé» ou une colonne booléenne pour indiquer que l'enregistrement est actif ou inactif?

Jerbersoft
la source
67
... s'il est plus noble dans la base de données de souffrir du gonflement et de la redondance des drapeaux, ou de prendre DELETE dans une table d'enregistrements, Et en les supprimant, mettez-les fin. Supprimer, dormir;
nickf le
7
Hey! Comment voter pour un commentaire ??
Nifle

Réponses:

48

Cela dépend certainement du contenu réel de votre base de données. Si vous l'utilisez pour stocker des informations de session, effacez-les immédiatement lorsque la session expire (ou est fermée), vous ne voulez pas que ces déchets traînent. Comme il ne peut pas vraiment être réutilisé à des fins pratiques.

En gros, ce que vous devez vous demander, est-ce que je pourrais avoir besoin de restaurer ces informations? Tout comme les questions supprimées sur SO, elles devraient certainement être simplement marquées `` supprimées '', car nous autorisons activement une annulation. Nous avons également la possibilité de l'afficher pour sélectionner les utilisateurs, sans trop de travail supplémentaire.

Si vous ne cherchez pas activement à restaurer complètement les données, mais que vous souhaitez toujours les conserver à des fins de surveillance (ou similaires). Je suggérerais que vous trouviez (dans la mesure du possible bien sûr) un schéma d'agrégation et que vous le poussiez dans une autre table. Cela gardera votre table principale propre des données `` supprimées '', ainsi que votre table secondaire optimisée à des fins de surveillance (ou tout ce que vous aviez à l'esprit).

Pour les données temporelles, voir: http://talentedmonkeys.wordpress.com/2010/05/15/temporal-data-in-a-relational-database/

falstro
la source
30

Avantages de l'utilisation d'un indicateur de suppression:

  1. Vous pouvez récupérer les données plus tard si vous en avez besoin,
  2. L'opération de suppression (mettre à jour l'indicateur) est probablement plus rapide que de la supprimer réellement

Inconvénients de l'utilisation d'un indicateur de suppression:

  1. Il est très facile de rater AND DeletedFlag = 'N'quelque part dans votre SQL
  2. Plus lent pour la base de données pour trouver les lignes qui vous intéressent parmi toutes les conneries
  3. Finalement, vous voudrez probablement vraiment le supprimer de toute façon (en supposant que votre système fonctionne correctement. Qu'en est-il lorsque cet enregistrement a 10 ans et qu'il a été "supprimé" 4 minutes après sa création)
  4. Cela peut rendre impossible l'utilisation d'une clé naturelle. Vous pouvez avoir une ou plusieurs lignes supprimées avec la clé naturelle et une ligne réelle souhaitant utiliser cette même clé naturelle.
  5. Il peut y avoir des raisons juridiques / de conformité pour lesquelles vous êtes censé supprimer des données.
WW.
la source
23

En complément de tous les articles ...

Cependant, si vous prévoyez de marquer l'enregistrement, il est bon d'envisager de créer une vue pour les enregistrements actifs. Cela vous éviterait d'écrire ou d'oublier l'indicateur dans votre requête SQL. Vous pouvez également envisager une vue pour les enregistrements non actifs, si vous pensez que cela sert également un objectif.

Adeel Ansari
la source
11

Je suis content d'avoir trouvé ce fil. Je me demandais moi aussi ce que les gens pensaient de cette question. J'ai implémenté le «marqué comme supprimé» pendant environ 15 ans sur de nombreux systèmes. Chaque fois qu'un utilisateur appelait pour dire que quelque chose était accidentellement supprimé, il était certainement beaucoup plus facile de le marquer comme non supprimé que de le recréer ou de le restaurer à partir d'une sauvegarde.

Nous utilisons postgresql et Ruby sur les rails, il semble que nous pourrions le faire de l'une des deux manières suivantes, modifier les rails ou ajouter un déclencheur ondelete et faire à la place une fonction pl / pgsql pour marquer comme supprimé. Je me penche vers ce dernier.

En ce qui concerne les performances, il sera intéressant de voir les résultats d'EXPLAIN-ANALYZE sur de grandes tables à quelques éléments supprimés ainsi que de nombreux éléments supprimés.

Dans les systèmes utilisés au fil du temps que j'ai trouvés, les nouveaux utilisateurs ont tendance à faire des choses idiotes comme supprimer des choses accidentellement. Ainsi, lorsque les gens sont nouveaux dans un poste, ils ont tous les droits d'accès de la personne qui occupait auparavant ce poste, sauf sans expérience. Effacer accidentellement quelque chose et pouvoir récupérer rapidement permet à tout le monde de se remettre rapidement au travail.

Mais comme quelqu'un l'a dit, parfois, vous pouvez avoir besoin de cette clé particulière pour une raison quelconque, à ce stade, vous devrez vraiment la supprimer, puis recréer les enregistrements (en la récupérant et en modifiant l'enregistrement).

user67403
la source
1
+1 parce que la convivialité implique de limiter ma capacité à faire des erreurs catastrophiques.
Jesse
6

Il existe également des problèmes juridiques dans les deux cas si des données personnelles sont impliquées. Je pense que cela dépend beaucoup de l'endroit où vous vous trouvez (ou de l'emplacement de la base de données) et des conditions d'utilisation.

Dans certains cas, des personnes peuvent demander à être supprimées de votre système, auquel cas une suppression définitive est nécessaire (ou au moins l'effacement de toutes les informations personnelles).

Je vérifierais auprès de votre service juridique avant d'adopter une stratégie de toute façon si des informations personnelles sont impliquées.

Jeremy français
la source
5

Je les marque comme supprimés et je ne les supprime pas vraiment. Cependant, de temps en temps, je balaye tous les déchets et les archive, pour ne pas tuer les performances.

Robert Gould
la source
2

Si vous craignez que les enregistrements «dormants» ralentissent votre accès à la base de données, vous pouvez déplacer ces lignes dans une autre table agissant comme une table «d'archive».

cruizer
la source
1

Pour les données saisies / gérées par l'utilisateur, j'ai utilisé la méthode d'indicateur que vous décrivez et j'ai donné à l'utilisateur une interface "vider la corbeille" pour supprimer réellement les éléments s'il le souhaite.

Abie
la source