2010-03-12 20 views
1

J'ai une table avec deux tables pour enfants. Pour chaque enregistrement dans la table parente, je veux un et un seul enregistrement dans l'une des tables enfant - pas un dans chaque, pas aucun. Comment puis-je définir cela?garantir les enregistrements enfants dans une table ou une autre, mais pas les deux?

Voici la trame de fond. N'hésitez pas à critiquer cette implémentation, mais veuillez répondre à la question ci-dessus, car ce n'est pas la seule fois que je l'ai rencontré:

J'ai une base de données qui contient des données relatives aux enquêtes auprès des utilisateurs. Il a été conçu à l'origine avec une méthode d'authentification pour démarrer une enquête. Depuis lors, les exigences ont changé, et il y a maintenant deux façons différentes de s'inscrire pour lancer un sondage.

À l'origine, j'ai capturé le jeton d'authentification dans une colonne de la table d'enquête. Comme les exigences ont changé, il y a trois autres bits de données que je veux capturer dans l'authentification. Donc, pour chaque enregistrement dans la table de sondage, je vais avoir un jeton, ou un ensemble de trois. Au lieu d'avoir quatre colonnes où l'une sera nulle, ou trois seront nulles (ou pire encore, un mauvais mashup de l'un ou l'autre de ces scénarios), J'aurais deux tables enfants, l'une pour contenir le jeton d'authentification unique, l'autre pour contenir les trois. Le problème est que je ne sais pas comment définir cela en DDL. J'utilise MySQL, alors il y a peut-être une fonctionnalité que MySQL n'implémente pas et qui me permet de le faire.

Répondre

1

Il y a plusieurs façons que vous pouvez mettre en œuvre cette

Drapeau logique booléenne

Vous pouvez avoir un drapeau booléen dans ParentTable appelé ChildTableDataInserted et vous pouvez mettre à jour cette TRUE si la ligne est insérée dans une seule table . Insérez uniquement dans une ligne enfant si la propriété ChildTableDataInserted est False. Ce bien sûr dépend de toutes les insertions utilisant les procédures stockées que vous créez et peut facilement être violé, mais les frais généraux sur la base de données sont faibles.

Déclencheurs

Mettez un AVANT INSERT sur l'insert de données à la fois des tables de l'enfant, et si votre état de défaut est remplie, vous pouvez soulever une erreur pour l'insert.

J'évite personnellement les déclencheurs à moins que je n'ai absolument aucune autre option et cela semble être un bon endroit pour implémenter des déclencheurs.

En savoir plus sur les déclencheurs ici

http://dev.mysql.com/doc/refman/5.0/en/create-trigger.html

+0

Ah! Les déclencheurs sont quelque chose que je n'ai jamais utilisé. Est-ce une situation où il n'y a pas d'autre choix qu'un déclencheur? Comment feriez-vous ce que je veux faire? – user151841

+2

Je considérerais violer la 3ème forme normale et mettre les 4 colonnes dans une table. –

+0

Pratique gagne, Raj :) – user151841