如何引用具有多个主键列的一个外键列
我正在创建BOOK_Issue表,其中将包含发布该书的人员的ID。 我有一个名称为user_id的女巫将包含来自tbl_student的id以及tbl_faculty。所以如何参考两个主键列来设置book_issue表的user_id字段。如何引用具有多个主键列的一个外键列
创建一个“person”超类,它可以是“student”类型或type“faculty”类型。请参考此而不是BOOK_Issue
表。
基本上要创建这种关系,您需要一个跨越“学生”和“教师”的唯一ID。把它放在一个表格中(tbl_person
?),并在tbl_student
和tbl_faculty
的每一行中引用这个新表格。这可能也是最好的,然后拉出tbl_student
和tbl_faculty
中的字段,然后将它们放在这个新的超类中。
您可以通过在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'”条件驱动的子查询。
您的数据库模式不正确。
如果您期望唯一的ID,那么它们应该在一个表中。
您可以创建一个包含所有用户的表格,并设置一个列来设置其类型(学生,教师)。然后根据每个用户的类型为每个用户创建2个不同的表格。
这应该是你的表设计:
FacultyTable(FacultyID,FacultyName) StudentsTable(StudentID,StudentName,FacultlyID,...) BookTable(的BookID,BOOKNAME,...) UsersTable(用户名,用户名,userPassword的,StudentID,LastLogin,...)
现在,这是主要的事情:
BookIssedTable(BookIssedID,的BookID,用户名) //此表告诉我,一本书的BookID的“颁布给“用户ID”的用户//这可以更好,因为这对初始设计来说肯定是一个很大的改进。