En supposant que j'ai bien compris votre scénario, voici ce que j'appellerais la bonne façon de procéder:
Commencez par une description de plus haut niveau de votre base de données! Vous avez des employés, et les employés peuvent être des employés «ce» et des employés «sn» (quels qu'ils soient). En termes orientés objet, il existe une classe "employé", avec deux sous-classes appelées "employé ce" et "employé sn".
Ensuite , vous traduisez cette description de niveau supérieur à trois tables: employees
, employees_ce
et employees_sn
:
employees(id, name)
employees_ce(id, ce-specific stuff)
employees_sn(id, sn-specific stuff)
Puisque tous les employés sont des employés (duh!), Chaque employé aura une ligne dans le employees
tableau. Les employés "ce" ont également une ligne dans le employees_ce
tableau et les employés "sn" ont également une ligne dans le employees_sn
tableau. employees_ce.id
est une clé étrangère de employees.id
, telle employees_sn.id
quelle.
Pour désigner un employé de quelque nature que ce soit (ce ou sn), reportez-vous au employees
tableau. Autrement dit, la clé étrangère avec laquelle vous avez eu des problèmes doit faire référence à cette table!
Vous pouvez probablement ajouter deux contraintes de clé étrangère (honnêtement: je ne l'ai jamais essayé), mais cela insisterait alors pour que la ligne parent existe dans les deux tables.
Au lieu de cela, vous souhaitez probablement créer un supertype pour vos deux sous-types d'employés, puis pointer la clé étrangère à la place. (En supposant que vous ayez une bonne raison de séparer les deux types d'employés, bien sûr).
type
dans la table des employés seraitce
ousn
.la source
LEFT JOIN
tous, s'il y en a peu. Lorsque vous n'utilisez pas la table de base 'employee', la clé primaire n'a pas pu être déclarée (car elle fait référence à tableA ou tableB ou…); maintenant ça peut l'être. La sagesse du fractionnementemployees_ce
et aemployees_sn
été supposée, et cette hypothèse est notée.En fait, je fais ça moi-même. J'ai une table appelée «Commentaires» qui contient des commentaires pour les enregistrements dans 3 autres tables. Aucune des deux solutions ne gère réellement tout ce que vous voulez probablement. Dans votre cas, vous feriez ceci:
Solution 1:
Ajoutez un champ tinyint à Employees_ce et Employees_sn qui a une valeur par défaut qui est différente dans chaque table (Ce champ représente un 'identificateur de table', nous les appellerons donc tid_ce & tid_sn)
Créez un index unique sur chaque table en utilisant le PK de la table et le champ d'ID de table.
Ajoutez un champ tinyint à votre table 'Deductions' pour stocker la seconde moitié de la clé étrangère (l'ID de table)
Créez 2 clés étrangères dans votre table 'Deductions' (Vous ne pouvez pas appliquer l'intégrité référentielle, car une clé sera valide ou l'autre ... mais jamais les deux:
Solution 2: Cette solution permet de maintenir l'intégrité référentielle: 1. Créez un deuxième champ de clé étrangère dans la table 'Deductions', autorisez les valeurs Null dans les deux clés étrangères et créez des clés étrangères normales:
L'intégrité n'est vérifiée que si la colonne n'est pas nulle, vous pouvez donc conserver l'intégrité référentielle.
la source
Je sais que c'est un sujet qui stagne depuis longtemps, mais au cas où quelqu'un chercherait, voici comment je gère les clés étrangères multi-tables. Avec cette technique, vous n'avez pas d'opérations en cascade appliquées par DBA, alors assurez-vous de traiter
DELETE
et autres dans votre code.L'exemple de SO Op ressemblerait à ceci
la source
Techniquement possible. Vous référeriez probablement employés_ce dans les retenues et employés_sn. Mais pourquoi ne pas fusionner employés_sn et employés_ce? Je ne vois aucune raison pour laquelle vous avez deux tables. Personne à plusieurs relations. Et (pas dans cet exemple) de nombreuses colonnes.
Si vous faites deux références pour une colonne, un employé doit avoir une entrée dans les deux tables.
la source
Oui c'est possible. Vous devrez définir 2 FK pour la 3e table. Chaque FK pointant vers le (s) champ (s) requis d'une table (soit 1 FK par table étrangère).
la source
En supposant que vous devez avoir deux tables pour les deux types d'employés pour une raison quelconque, je vais prolonger la réponse de vmarquez:
Schéma:
Données en déductions:
Cela vous permettrait de faire pointer les déductions vers n'importe quelle autre table de votre schéma. Ce type de relation n'est pas pris en charge par les contraintes au niveau de la base de données, IIRC donc vous devrez vous assurer que votre application gère correctement la contrainte (ce qui la rend plus lourde si vous avez plusieurs applications / services différents qui frappent la même base de données).
la source