2010-10-19 4 views
2

J'ai une table qui contient deux types de données, soit pour Société ou Employé.Clé étrangère conditionnelle à plusieurs tables

Identifier ces données par 'C' ou 'E' & une colonne qui en stocke la clé primaire.

Alors, comment puis-je donner une clé étrangère en fonction des données contenues & maintenir l'intégrité référentielle dynamiquement.

id | referenceid | documenttype 
------------------------------- 
1 | 12   | E 
2 | 7   | C 

ramer maintenant avec id 1 devrait faire référence à la table des employés avec pk 12 & ligne avec id 2 devrait faire référence à la table avec la société pk 7.

Sinon, je dois faire deux tables différentes pour les deux. Existe-t-il un autre moyen de l'accomplir?

+0

Vous voulez dire une clé étrangère * de * la table contenant «C» ou «E» à d'autres tables (si c'est le cas la réponse est * pas possible *)? Ou vice versa? Pourriez-vous s'il vous plaît esquisser votre conception DB. –

+0

related: http://stackoverflow.com/questions/2002985/mysql-contraint-contraint-forey-foreign –

Répondre

1

Si vous voulez vraiment faire cela, vous pouvez avoir deux colonnes valables une pour CompanyId et une pour EmployeeId qui agissent comme des clés étrangères.

Mais je préférerais que vous essayiez de revoir la conception du schéma de la base de données.

1

Il serait préférable de normaliser la table - Créer des tables séparées pour l'entreprise et l'employé. Vous obtiendrez également de meilleures performances après la normalisation. Sincec la Société et l'Employé sont des entités distinctes, mieux vaut ne pas les superposer.

+0

Créer des clés étrangères dynamiques ne semble pas possible – Anurag

1

Personnellement, je voudrais aller avec l'option de deux tables différentes. Employé/Société semblent être suffisamment distincts pour que je ne veux pas stocker leurs données ensemble. Cela rendra les références de clés étrangères aussi directes. Cependant, si vous voulez toujours le stocker dans une table, l'un des moyens de conserver l'intégrité référentielle serait d'utiliser un déclencheur.

  • Vous avez déjà un déclencheur Insérer/mise à jour qui vérifie la valeur appropriée dans le maître entreprise maître/employé en fonction de la valeur de la colonne contenant « C »/« E »

Personnellement, je préférerais éviter une telle logique que les déclencheurs sont notoirement difficiles à déboguer.