La raison pour laquelle vous avez besoin d'une table unique est-elle la raison pour laquelle vous voulez vous assurer que lorsque les six tables parent référencent une instance donnée d'une ligne enfant dont la garantie est la même instance? C'est le problème classique des "multi-parents". Un exemple d'où vous pourriez rencontrer ceci est avec des adresses ou des numéros de téléphone avec plusieurs tables de personne/contact.
je peux penser à deux options:
Choix 1: Une table de lien pour chaque table parent. Ce serait l'architecture Hoyle. Donc, quelque chose comme:
Create Table MyTable(
id int not null Primary Key Clustered
, info1 varchar(50) null
, info2 varchar(50) null
, info3 varchar(50) null
)
Create Table LinkTable1(
MyTableId int not null
, ParentTable1Id int not null
, Constraint PK_LinkTable1 Primary Key Clustered(MyTableId, ParentTable1Id)
, Constraint FK_LinkTable1_ParentTable1
Foreign Key (MyTableId)
References MyTable (Id)
, Constraint FK_LinkTable1_ParentTable1
Foreign Key (ParentTable1Id)
References ParentTable1 (Id)
)
...
Create Table LinkTable2...LinkTable3
Choix 2. Si vous saviez que vous auriez jamais plus dire six tables et étaient prêts à accepter une dénormalisation et un design fugly, vous pouvez ajouter six clés étrangères à votre table principale . Cela évite le problème de remplir un tas de tables de liens et garantit une intégrité référentielle correcte. Cependant, cette conception peut rapidement devenir incontrôlable si le nombre de parents augmente.
Si vous êtes satisfait de votre conception existante, alors en ce qui concerne la taille du champ, j'utiliserais le nom complet de la table. Franchement, la différence de performance entre un char (3) et un varchar (50) ou même un varchar (128) sera négligeable pour la quantité de données que vous êtes susceptible de mettre dans le tableau. Si vous pensiez vraiment que vous alliez avoir des millions de lignes, alors je considérerais fortement l'option de relier des tables. Si vous vouliez rester avec votre conception et que vous vouliez la performance maximale, alors j'utiliserais une tinyint avec une clé étrangère à une table qui contenait la liste des six tables avec une clé primaire tinyint. Cela empêche le nombre d'être "magique" et garantit que vous affinez la liste des tables parent. Bien sûr, cela n'empêche toujours pas les enregistrements orphelins. Dans cette conception, vous devez utiliser des déclencheurs pour le faire.
Que signifie la première ligne de votre définition de table? ** int id int FK_id varchar (50) ** –
Donc la valeur FK peut être un PK de 1 des 6 autres tables? –
@KM cela signifie que l'éditeur m'a eu. Le fixe maintenant. @iKnowKungFoo Correct.C'est parce que c'est la même information dans chaque table mais je dois pouvoir accéder à n'importe lequel d'entre eux sans devoir réunir chacune des 6 tables. – corymathews