web-dev-qa-db-fra.com

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

Je ne pense pas que je suis la seule personne à me poser des questions à 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 signaler l'enregistrement avec un indicateur "supprimé" ou une colonne booléenne pour indiquer que l'enregistrement est actif ou inactif?

105
jerbersoft

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

Fondamentalement, ce que vous devez vous demander, pourrais-je avoir besoin de restaurer ces informations? Comme les questions supprimées sur SO, elles devraient certainement être marquées 'supprimées', car nous autorisons activement la suppression. Nous avons également la possibilité de l'afficher pour sélectionner des utilisateurs également, 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 vers un autre tableau. 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 pensiez).

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

45
falstro

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 (mise à jour du drapeau) est probablement plus rapide que la suppression réelle

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 le supprimer de toute façon (en supposant que votre système réussit. Qu'en est-il lorsque cet enregistrement a 10 ans et qu'il a été "supprimé" 4 minutes après sa création initiale)
  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 vraie ligne souhaitant utiliser cette même clé naturelle.
  5. Il peut y avoir des raisons légales/de conformité pour lesquelles vous êtes censé supprimer des données.
25
WW.

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.

20
Adeel Ansari

Je suis content d'avoir trouvé ce fil. Je me demandais aussi ce que les gens pensaient de cette question. J'ai mis en œuvre le "marqué comme supprimé" pendant environ 15 ans sur de nombreux systèmes. Chaque fois qu'un utilisateur appelait pour dire que quelque chose avait été 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 on Rails il semble que nous pourrions le faire de l'une des deux manières suivantes, modifiez Rails ou ajouter un déclencheur ondelete et fait à la place une fonction pl/pgsql pour marquer comme supprimé. Je penche vers ce dernier.

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

Dans les systèmes utilisés au fil du temps, j'ai trouvé que les nouveaux utilisateurs ont tendance à faire des choses stupides comme supprimer des choses accidentellement. Ainsi, lorsque les personnes sont nouvelles dans une position, elles ont tous les droits d'accès de la personne précédemment dans cette position, sauf avec une expérience nulle. La suppression accidentelle d'un élément et la récupération rapide permettent à tout le monde de se remettre au travail rapidement.

Mais comme quelqu'un l'a dit, vous pouvez parfois 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 supprimant et en modifiant l'enregistrement).

10
user67403

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 en grande partie 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 effacer toutes les informations personnelles).

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

6
Jeremy French

Je les marque comme supprimés et ne les supprime pas vraiment. Cependant, de temps en temps, je balaie toutes les ordures et les archive, donc cela ne tue pas les performances.

5
Robert Gould

Si vous craignez que les enregistrements "dormants" ne ralentissent votre accès à la base de données, vous souhaiterez peut-être déplacer ces lignes dans une autre table faisant office de table "d'archivage".

2
cruizer

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

1
Abie