如何引用具有多个主键列的一个外键列

时间:2009-11-24 04:30:48

标签: reference foreign-key-relationship

我正在创建BOOK_Issue表,其中包含发给该书的人的ID。 我有一个列名user_id女巫将包含来自tbl_student以及tbl_faculty的id。所以如何参考两个主键列设置book_issue表的user_id字段。

4 个答案:

答案 0 :(得分:2)

您的数据库架构不正确。

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

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

答案 1 :(得分:0)

创建一个“人”超类,可以是“学生”类型,也可以是“教师”类型。请改为从BOOK_Issue表中引用 this

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

答案 2 :(得分:0)

您可以通过在BOOK_Issue表中添加一个额外的列来解决问题,该列位于user_id旁边,表示这是学生ID还是教师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'”条件驱动的子查询。

答案 3 :(得分:0)

这应该是你的桌子设计:

FacultyTable(FacultyID,FacultyName) StudentsTable(StudentID,StudentName,FacultlyID,...) BookTable(BookID,BookName,...) UsersTable(UserID,UserName,UserPassword,StudentID,LastLogin,...)

现在这是主要的事情:

BookIssedTable(BookIssedID,BookID,UserID) //这个表告诉我一本书“BookID”发给了“UserID”的用户 //这可能会更好,这肯定是最初设计的一大改进。