2016-08-24 1 views
0

Je suis en train de faire de cette base de données de démonstration où je tables commeEst-il acceptable de référencer les clés primaires de toutes les tables de la base de données en tant que clé étrangère d'une table?

Household(Primary key - hid) 
People(Primary key - pepid) 
ParChildOld(Primary key - pcoid) 
Job(Primary key - empid) 
School(Primary key - schlid) 
Pension(Primary key - penid) 

Maintenant, j'ai différents attributs sur les détails des personnes dans chaque ménage dans différentes tables. Puis-je prendre les clés primaires de toutes les tables et créer une table, disons AllKeys et les référencer comme des clés étrangères dans ce tableau particulier?

-à-dire:

AllKeys Table 
Primary Key: AKid 
-- Other columns include 
foreign keys- hid,pepid,pcoid,empid,schid,penid* 

Je ne sais pas si cela est ridicule de demander ou non, mais,

est une référence autorisée? Peut-il être considéré comme une forme normalisée? Est-ce que les requêtes lancées de cette manière en rejoignant la table AllKeys et toute autre table (en fonction de la requête) fonctionneront efficacement?

+0

Je ne sais pas exactement ce que la question est, mais vous devez spécifier exactement quelle table votre clé étrangère fait référence. Juste un. (Mais vous pourriez avoir beaucoup de contraintes de clés étrangères sur la même colonne, toutes pointant vers des choses différentes) – Thilo

+1

il peut être utilisé mais tout dépend de votre exigence. –

+0

C'est possible mais, plus important encore, est-ce approprié? Le nom de votre table (AllKeys) n'évoque pas un prédicat métier pouvant justifier une telle utilisation. Pourquoi voulez-vous faire ceci/quelle serait la signification de cette table? – reaanb

Répondre

1

Vous pouvez si toutes ces tables sont liées, mais il échouerait les troisième et quatrième formes normales, ayant des dépendances à la fois fonctionnelles et à plusieurs valeurs dans la table. Considérons les énormes quantités de duplication nécessaires pour stocker les relations pour un seul ménage: un ménage (hid = 1), deux parents (pepid = 1,2), deux enfants (pepid = 3,4), quatre parents - les relations d'enfant (pcoid = 1,2,3,4), deux emplois (empid = 1,2), une école pour les deux enfants (schlid = 1) et deux pensions (pénid = 1,2).

AKid | hid | pepid | pcoid | empid | schlid | penid 
-----|-----|-------|-------|-------|--------|------ 
1 | 1 | 1  | 1  | 1  | null | 1 
2 | 1 | 1  | 2  | 1  | null | 1 
3 | 1 | 2  | 3  | 2  | null | 2 
4 | 1 | 2  | 4  | 2  | null | 2 
5 | 1 | 3  | 1  | null | 1  | null 
6 | 1 | 3  | 2  | null | 1  | null 
7 | 1 | 4  | 3  | null | 1  | null 
8 | 1 | 4  | 4  | null | 1  | null 

Un autre problème est que, en supposant ParChildOld de table contient un parent et une colonne d'enfant, vous avez aucun moyen de spécifier que ce soit pour une référence pcoid dans AllKeys, si le PEPID fait référence au parent ou l'enfant.

En bref, ne le faites pas.

+0

merci .. l'exemple a effacé la confusion .. – Shachi

1

Non, cela augmentera les complexités.

  1. Vous aurez besoin d'écrire du code supplémentaire pour maintenir ces
  2. FKs En raison de nombreuses opérations DML la table peut créer des blocages (selon le moteur DB vous allez utiliser) et l'ensemble de votre DB arrêtera répondre parce que la plupart des requêtes dépendra de ce tableau

Conserver les données sous forme normalisée et de mettre vos efforts sur les requêtes et de le maintenir.

Vous devriez vous concentrer davantage sur l'indexation correcte de vos tables (en fonction de la façon dont vous allez les interroger).

David Scarlett has defined it with a very nice example.

+0

l'a eu ... son mieux ne pas utiliser cela .. thanku. – Shachi