2010-05-17 7 views
0

Je travaille sur une base de données mais je suis un peu nouveau à ce sujet, donc j'ai rencontré un problème aujourd'hui. J'ai quelques tables: BUREAU, SALLE, EMPLOYÉ et DOCUMENT. Le document doit spécifier l'expéditeur, qui peut être un employé unique, une pièce entière ou un bureau entier, de sorte qu'il doit avoir une référence aux clés primaires de ces tables. Est-ce que je devrais faire une table "parallèle" pour le manipuler (par exemple j'ai fait un pour manipuler les documents de plusieurs destinataires) ou il y a une autre manière? MerciRéférence multiple dans SQL

+0

Pouvez-vous poster plus sur votre schéma, je ne l'obtiens toujours pas – vodkhang

+0

bien sûr, j'ai 3 table: BUREAU, SALLE et EMPLOYEE. ils ont leur propre ID (leur clé primaire) et quelques colonnes avec d'autres infos. Ensuite, il y a une autre table, DOCUMENT, qui a une colonne, expéditeur, qui peut être une, et une seule, d'autres tables (par exemple un seul employé, une pièce ou le bureau entier) donc je voulais faire référence à un autre la clé primaire de la table (donc si le document a été écrit par la salle A2, dont l'id est ab34, je peux écrire ab34 dans l'endroit "expéditeur", si c'était l'employé Kevin, dont l'identifiant est kv45, je peux écrire kv45). j'espère que ça aide – AGarofoli

Répondre

1

Je serais enclin à avoir une clé étrangère à chacune des trois tables avec une contrainte de vérification qui assure qu'un seul aura une valeur. De cette façon, vous pouvez toujours utiliser l'intégrité référentielle standard. Btw, cela suppose que la règle métier est que chaque document doit avoir un et un seul expéditeur.

Create Table Document 
(
    SenderEmployeeId ... 
    , SenderRoomId ... 
    , SenderOfficeId.... 
    , Constraint CK_Document_SingleSender Check (Case 
                When SenderEmployeeId Is Not Null And SenderRoomId Is Null And SenderOfficeId Is Null Then 1 
                When SenderRoomId Is Not Null And SenderEmployeeId Is Null And SenderOfficeId Is Null Then 1 
                When SenderOfficeId Is Not Null And SenderEmployeeId Is Null And SenderRoomId Is Null Then 1 
                Else 0 
                End = 1) 
)
+0

oui, un document ne peut avoir qu'un seul expéditeur, donc je vais probablement utiliser une solution de contrainte de vérification. Merci – AGarofoli

0

Vous essayez de créer des clés étrangères conditionnelles que vous ne pouvez pas faire dans SQL Server. Je pense que la création d'une table pour contenir le document et l'expéditeur est une bonne idée, mais vous ne serez pas en mesure de créer les clés étrangères. Vous pouvez cependant implémenter un Check Constraint pour contrôler les données.

+0

Je ne connais pas la contrainte de contrôle trop bien mais il semble être la meilleure solution. Merci pour le lien! – AGarofoli

0

Je voudrais implémenter cela avec des tables parallèles comme vous l'avez mentionné. Les tables seraient en tant que tels:

OfficeDocuments (OfficeID, DocumentID)

RoomDocuments (RoomID, DocumentID)

EmployeeDocuments (EmployeeID, DocumentID)

Vous pouvez concevoir des requêtes plus flexibles avec un design comme ceci, comme joinin contre les tables de pièce et de bureau pour acquérir une liste d'employés.

La méthode que vous choisissez doit dépendre de la flexibilité dont vous avez besoin. Si vous ne concevez qu'une ou deux requêtes pour cette table, il peut être judicieux d'avoir une table dénormalisée à la place (en utilisant des contraintes de vérification et plusieurs attributs pour chaque type de table pouvant être un expéditeur).

+0

La seule requête que je dois avoir est celle qui me permet de vérifier qui a écrit un document, une contrainte de vérification le rendrait plus facile que la méthode des "tables parallèles" mais vous avez raison, c'est une solution plus flexible. Pour l'instant je n'ai pas besoin d'être flexible, je pourrais avoir besoin de changer de solution bientôt. Probablement je vais essayer les deux et voir lequel fonctionne le mieux, merci! – AGarofoli