Je crée une table BOOK_Issue qui contiendra l'ID de la personne à laquelle le livre est émis. J'ai un nom de colonne user_id qui contiendra les ids de tbl_student ainsi que tbl_faculty. donc comment définir le champ user_id de la table book_issue avec référence à deux colonnes de clé primaire.Comment référencer une colonne de clé étrangère avec plusieurs colonnes de clé primaire
Répondre
Créer une superclasse «personne» qui peut être de type «étudiant» ou de type «faculté». Référence ce à partir de la table BOOK_Issue
à la place. Fondamentalement, pour créer cette relation, vous aurez besoin d'un ID unique qui couvre à la fois «étudiant» et «faculté». Mettez ceci dans un tableau (tbl_person
?) Et faites en sorte que chaque ligne de tbl_student
et tbl_faculty
fasse référence à cette nouvelle table. Il est probablement préférable de retirer ensuite les champs présents à la fois dans tbl_student
et tbl_faculty
et de les placer dans ce nouveau supertable à la place.
Vous pouvez résoudre le problème en disposant d'une colonne supplémentaire dans la table BOOK_Issue, à côté de user_id, qui indique s'il s'agit d'un ID d'étudiant ou d'un ID de faculté. Alternativement, les identifiants eux-mêmes peuvent facilement inclure certains motifs qui indiquent leur nature (par exemple, tous les ids de faculté peuvent commencer par dire «UC», et aucun des id d'étudiant ne le sont).
Les deux solutions ci-dessus permettent d'utiliser ensuite des requêtes similaires à
SELECT B.*,
CASE B.BorrowerType -- could be LEFT(user_id, 2) etc...
WHEN 'S' THEN S.Name
WHEN 'F' Then F.Name
END As Name,
CASE B.BorrowerType
WHEN 'S' THEN S.PhoneNumber
WHEN 'F' Then F.Phone -- Note that these constructs allow
-- mapping distinct columns names etc.
END As PhoneNr
FROM BOOK_Issue B
LEFT JOIN tbl_student S ON B.BorrowerType = 'S' AND B.user_id = S.id
LEFT JOIN tbl_faculty F ON B.BorrowerType = 'F' AND B.user_id = F.id
WHERE B.DueDate < '11/23/2009' -- or some other condition
suivant Cela peut devenir un peu lourd quand nous avons besoin d'obtenir plusieurs colonnes des tables étudiants/professeurs. Une alternative possible est une UNION, mais cela entraînerait alors la répétition de la clause de recherche. Enfin, la meilleure solution mais non disponible sur tous les SGBD est une sous-requête pilotée par une condition "IF B.BorrowerType = 'S'".
Votre schéma de base de données n'est pas correct.
Si vous attendez des ID uniques, ils doivent figurer dans une table.
Vous pouvez créer une table avec tous les utilisateurs, et avoir une colonne pour définir leur type (étudiant, faculté). Ensuite, créez 2 tables différentes pour chaque type qui a les informations appropriées pour chaque utilisateur en fonction de leur type.
Cela devrait être votre conception de la table:
FacultyTable (FacultyID, FacultyName) StudentsTable (StudentID, StudentName, FacultlyID, ...) BookTable (BookID, BookName, ...) UsersTable (UserID, UserName, UserPassword, StudentID, lastlogin, ...)
maintenant, c'est la chose principale:
BookIssedTable (BookIssedID, BookID, UserID) // ce tableau me dit qu'un livre de « BookID a été publié à un utilisateur de "UserID" // cela peut être mieux car c'est certainement une grande amélioration par rapport à la conception initiale.