2009-11-24 102 views

回答

0

创建一个“person”超类,它可以是“student”类型或type“faculty”类型。请参考而不是BOOK_Issue表。

基本上要创建这种关系,您需要一个跨越“学生”和“教师”的唯一ID。把它放在一个表格中(tbl_person?),并在tbl_studenttbl_faculty的每一行中引用这个新表格。这可能也是最好的,然后拉出tbl_studenttbl_faculty中的字段,然后将它们放在这个新的超类中。

0

您可以通过在BOOK_Issue表中的user_id旁边添加一个额外的列来解决问题,该列指示这是学生ID还是Faculty ID。

或者,ID本身可能很容易包含某些表明其性质的模式(例如,没有所有的教师ID可能以“UC”开始,并且学生ID都不是这样)。

两个解决方案上面然后允许使用类似于以下

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 

这种查询可以得到一个有点沉重,当我们需要从学生/教师表得到多列。一种可能的选择是UNION,但是这会导致重复搜索条款。

最后,在所有DBMS上不能使用的最佳解决方案是由“IF B.BorrowerType ='S'”条件驱动的子查询。

2

您的数据库模式不正确。

如果您期望唯一的ID,那么它们应该在一个表中。

您可以创建一个包含所有用户的表格,并设置一个列来设置其类型(学生,教师)。然后根据每个用户的类型为每个用户创建2个不同的表格。

0

这应该是你的表设计:

FacultyTable(FacultyID,FacultyName) StudentsTable(StudentID,StudentName,FacultlyID,...) BookTable(的BookID,BOOKNAME,...) UsersTable(用户名,用户名,userPassword的,StudentID,LastLogin,...)

现在,这是主要的事情:

BookIssedTable(BookIssedID,的BookID,用户名) //此表告诉我,一本书的BookID的“颁布给“用户ID”的用户//这可以更好,因为这对初始设计来说肯定是一个很大的改进。

相关问题