2009-11-24 5 views

Répondre

0

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.

0

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'".

2

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.

0

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.

Questions connexes