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
Répondre
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)
)
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
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.
Je ne connais pas la contrainte de contrôle trop bien mais il semble être la meilleure solution. Merci pour le lien! – AGarofoli
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).
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
- 1. Empêcher la référence multiple jQuery
- 2. Valeurs SQL Paramètre Multiple
- 3. multiple de type drupal contenu référence
- 4. SQL multiple exclusif comme
- 5. sélection multiple dans une instruction SQL
- 6. mysql limite multiple dans une instruction sql
- 7. SQL Multiple Groups - C'est possible?
- 8. SQL Clause WHERE multiple Problème
- 9. Problème avec référence multiple à une bibliothèque de classes
- 10. serveur SQL 2008 multiple « LIKE » problème
- 11. Héritage multiple dans LINQtoSQL?
- 12. Ligne multiple INSERT dans SQL, à partir du fichier texte
- 13. Stockage multiple d'images et de fichiers BLOB dans SQL Server
- 14. Option de recherche multiple dans SQL SERVER 2005
- 15. Multiple WHERE dans la même méthode SQL LINQ 2
- 16. Erreur de traitement dans le script d'insertion multiple (sql)
- 17. MYSQL insertion multiple dans CodeIgniter
- 18. circulaire Référence- LINQ to SQL
- 19. TTPickerTextField multiple dans TTMessageController
- 20. Multiple ResultSet dans EntityFramework
- 21. PHP Multiple
- 22. Besoin d'aide dans la liste multiple multiple sélectionnez
- 23. Une bonne référence pour Oracle PL/SQL
- 24. Multiple NOT distinct
- 25. Référence SQL Server une colonne calculée
- 26. Linq to SQL - Multiple où clasues à l'exécution
- 27. Requête Access sql Erreur de référence circulaire
- 28. Liste déroulante de sélection multiple multiple
- 29. instruction select multiple dans la procédure stockée
- 30. Fonction REPLACE multiple dans Oracle
Pouvez-vous poster plus sur votre schéma, je ne l'obtiens toujours pas – vodkhang
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