2011-03-08 4 views
2

J'ai plusieurs tables où les données doivent être "marquées pour suppression" mais pas effacées, ou basculer entre les données publiées et cachées.Création de tables pour les données supprimées

La manière la plus intuitive de gérer ces cas est d'ajouter une colonne dans la base de données deleted int(1) ou public int(1). Cela soulève le souci de ne pas oublier de spécifier WHERE deleted=0 pour chaque fois que cette table est en cours d'accès. J'ai pensé à surmonter cela en créant des tables dupliquées pour les données supprimées/non publiées telles que article =>article_deleted et en déplaçant les données au lieu de les supprimer. Cela fournit 2 numéros:

  1. contraintes clés étrangères finissent par être extrêmement ennuyeux pour maintenir
  2. Nombre de tables avec le contenu caché double (dans mon cas ~ 20 Devient ~ 40 tables)

Ma dernière idée est de créer une copie de la base de données entière appelée unreleased et de migrer des données là-bas.

Ma question ne porte pas sur safety de la gestion des données, mais plus de - quelle est la bonne façon de le faire depuis le début?

+0

C'est la douleur supplémentaire que vous prenez pour un problème très commun. Avoir une colonne supplémentaire 'deleted' est beaucoup plus simple. Je recommande contre la table en double. – Nishant

+0

Je serais reconnaissant à MySQL d'avoir une colonne intégrée parmi les lignes de 'DNR_ON_SELECT' (ne pas retourner), et si une telle colonne existe et est définie sur 1, alors explicitement' SELECT IGNORE_DNR ...'est nécessaire – Mikhail

+0

Une suggestion mineure, mais j'aurais pensé qu'il serait légèrement plus logique d'avoir un champ' active' plutôt qu'un 'deleted'. (Peut-être que c'est juste moi, mais il semble plus naturel d'inclure automatiquement une clause 'WHERE ... active = 1'.) –

Répondre

3

J'ai déjà rencontré ce problème et je pense que c'est une mauvaise idée de créer une base de données inutilement lourde parce que vous avez peur du mauvais code.

Je pense que ce serait une meilleure idée de faire des tests approfondis sur votre serveur de test avant de passer en production. Même moi, la colonne "Deleted" m'a fait trébucher plusieurs fois quand je l'ai rencontré pour la première fois mais j'ai fini par l'attraper, et si vous avez un bon environnement Dev/Test/Production, ça devrait aller. En résumé, conservez la colonne de suppression et demandez plus à vos codeurs.

MISE À JOUR:

Sinon, vous pouvez créer une vue qui tire que les enregistrements qui ne sont pas supprimés et assurez-vous que tout le monde utilise les requêtes SELECT.

+1

Upvote & accepter pour créer une vue. Cela peut être étendu à l'endroit où les tables autorisées à être utilisées sur les productions doivent commencer avec un certain caractère. Ceci permet d'avoir des drapeaux "supprimés" ou "inactifs" ou "staff_only", tout en fixant tout "SELECT" en seulement 1 modification de la vue – Mikhail

+0

+1 pour "créer une vue". En fait, il est assez difficile de ne pas avoir deux vues, une pour les articles "actifs" et une pour les articles "inactifs", et des déclencheurs (si nécessaire) pour vous permettre de mettre à jour les vues. Ensuite, vous pouvez simplement utiliser les vues au lieu des tables de base. –

0

Je pense que votre approche initiale est "correcte" et "correcte", mais votre préoccupation à ce sujet étant légèrement sujette aux erreurs est valide.

Vous devrez probablement vous assurer que vos procédures de test sont assez rigoureuses pour détecter les erreurs.

0

La première approche est la meilleure que j'ai trouvée. J'appelle la colonne active au lieu de supprimé. L'enregistrement existe mais il peut être actif ou inactif. Alors, si vous avez vraiment besoin de supprimer des choses, la terminologie ne devient pas fou. Dire «Supprimer les enregistrements inactifs» est logique, mais dire «Supprimer les enregistrements supprimés» devient confus.

Questions connexes