56 votes

Quel est le meilleur moyen d'implémenter la suppression logicielle?

Travailler sur un projet en ce moment et nous avons à mettre en œuvre la suppression logicielle pour la majorité des utilisateurs (rôles d'utilisateur). Nous avons décidé d'ajouter un "is_deleted='0'" champ sur chaque table dans la base de données et le mettre à " 1 " si particulier des rôles de l'utilisateur de frapper un bouton supprimer sur un enregistrement spécifique.

À l'entretien, à présent, à chaque requête SELECT aurez besoin pour s'assurer qu'ils ne comprennent pas les documents où is_deleted='1'.

Est-il une meilleure solution pour la mise en œuvre de la suppression logicielle?

Mise à jour: je tiens également à noter que nous avons une base de données d'Audit qui effectue un suivi des modifications (sur le terrain, ancienne valeur, la valeur à neuf, du temps, de l'utilisateur, ip) pour toutes les tables/champs dans la base de données d'Application.

104voto

ctcherry Points 15112

Je me pencherais vers la "voie Rails" avec une colonne delete_at contenant la date et l'heure de la suppression. Ensuite, vous obtenez un peu de métadonnées gratuites sur la suppression. Pour votre SELECT, obtenez simplement les lignes OERE delete_at EST NULL

56voto

David J. Sokol Points 1730

Vous pouvez exécuter toutes vos requêtes dans une vue contenant la clause WHERE IS_DELETED='0' .

22voto

Sergey Stadnik Points 1193

Ayant is_deleted colonne est une assez bonne approche. Si c'est dans Oracle pour accroître encore les performances, je recommande partitionnement de la table en créant une liste de partition sur is_deleted colonne. Ensuite supprimé et non supprimé les lignes vont être physiquement dans des partitions différentes, même si pour vous ça va être transparent.

Par conséquent, si vous tapez une requête comme

SELECT * from table_name where is_deleted = 1

ensuite, Oracle va effectuer la " partition de l'élagage et de regarder dans la partition appropriée. En interne, une partition est une table différente, mais il est transparent pour l'utilisateur: vous serez en mesure de sélectionner à travers l'ensemble de la table, peu importe si il est partitionné ou pas. Mais Oracle sera en mesure de rechercher SEULEMENT les pertition il a besoin. Par exemple, supposons que vous avez 1000 lignes avec IS_DELETED=0 et 100000 lignes avec IS_DELETED=1, et la partition de la table sur IS_DELETED. Maintenant, si vous incluez condition

WHERE ... AND IS_DELETED=0

ensuite, Oracle s'analyser UNIQUEMENT la partition avec 1000 lignes. Si la table n'étaient pas partitionné, il aurait à balayer 101000 lignes (les deux partitions).

16voto

Jeremiah Peschka Points 4756

La meilleure réponse, malheureusement, dépend de ce que vous voulez accomplir avec votre douce suppressions et de la base de données vous êtes à la mise en œuvre de ce sein de.

Dans SQL Server, la meilleure solution serait d'utiliser un deleted_on/deleted_at colonne avec un type de SMALLDATETIME ou DATETIME (en fonction de la granularité nécessaire) et faire que la colonne nullable. Dans SQL Server, la ligne d'en-tête de données contient une valeur NULL masque de bits pour chacune des colonnes dans la table de sorte qu'il est légèrement plus rapide pour effectuer un is NULL ou is not NULL que c'est pour vérifier la valeur stockée dans une colonne.

Si vous avez un grand volume de données, vous voulez regarder dans le partitionnement des données, soit par le biais de la base de données elle-même ou par l'intermédiaire de deux tableaux distincts (par exemple, les Produits et ProductHistory) ou par l'intermédiaire d'une vue indexée.

Je évitent généralement le pavillon champs comme is_deleted, is_archive, etc, car ils portent un morceau de sens. Nullable deleted_at, archived_at champ fournit un niveau supplémentaire de sens pour vous et pour celui qui hérite de votre application. Et j'ai éviter le masque de bits des champs comme la peste car ils nécessitent une compréhension de la façon dont le masque de bits a été construit afin d'en saisir tout le sens.

15voto

Jiaaro Points 14379

si la table est volumineuse et que les performances posent problème, vous pouvez toujours déplacer les enregistrements supprimés vers une autre table contenant des informations supplémentaires telles que le moment de la suppression, le nom de l'auteur de la suppression, etc.

De cette façon, vous n'avez pas à ajouter une autre colonne à votre table primaire.

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