2010-08-31 11 views
3

ont des bugs ou des applications obtenir des bugs quand mis à jour, certains cachés qu'ils obtiennent des mois ou des années plus tard détectés, la production d'enregistrements orphelins, clés pointant nulle part, etc., même avec des suites de tests appropriés. Bien que Rails n'applique pas l'intégrité référentielle au niveau de la base de données - et pour de bonnes raisons évoquées ailleurs cela restera comme ça - il serait toujours agréable d'avoir des outils qui peuvent vérifier si la base de données est dans un état cohérent.Existe-t-il des outils permettant à Rails de valider l'intégrité référentielle de la base de données?

Puisque les modèles décrivent ce qui « devrait être », ne serait-il possible que un outil hors ligne valide l'intégrité de toutes les données. Il pourrait être exécuté régulièrement, avant de sauvegarder des données ou simplement pour le bon sommeil des développeurs.

Y a-t-il quelque chose comme ça?

Répondre

0

Comment l'utilisation du SGBD pour appliquer RI? Vous n'avez pas besoin de Rails pour le faire pour vous.

+0

ActiveRecord (ORM utilisé dans les rails) ne le supporte pas par défaut – f0ster

+0

Bien sûr, mais pourquoi laisser les limitations d'un outil logiciel faire obstacle à vos besoins d'intégrité des données? Utilisez de meilleurs outils. – sqlvogel

2

Je ne sais pas d'un tel outil. Au moins, vous êtes conscient des dangers des dangers de l'intégrité référentielle. Alors pourquoi te faire souffrir? Il suffit d'utiliser les références de clés étrangères en premier lieu, comme suggéré par Dportas.

Pour l'utiliser dans une migration, ajouter quelque chose comme ceci:

execute('ALTER TABLE users ADD FOREIGN KEY (language_id) REFERENCES languages(id)') 

pour faire la colonne language_id des utilisateurs de référence une ligne valide dans la table des langues.

En fonction de votre SGBD cela va même créer automatiquement un index pour vous. Il existe également des plugins pour les rails (consultez pg_on_rails) qui définissent des fonctions d'alias faciles à utiliser pour ces tâches.

La vérification de l'intégrité uniquement sur le fichier de sauvegarde est inutile car l'erreur s'est déjà produite et vos données peuvent déjà être corrompues. (J'ai été là) D'autre part, lorsque vous utilisez des contraintes de clés étrangères comme indiqué ci-dessus, toute opération qui gâchera l'intégrité échouera. Pensez-y comme aller chez le dentiste quand vous ressentez de la douleur (= avoir une chirurgie) vs se brosser les dents une fois avec une pâte dentaire qui garantit que vos dents seront bien pour le reste de votre vie. Une autre chose à considérer: Une erreur dans votre application sera beaucoup plus facile à localiser, car une exception sera levée au niveau du code qui essaie d'insérer les données corrompues.

Veuillez donc utiliser des contraintes de clé étrangères. Vous pouvez facilement ajouter ces instructions à votre base de données existante.