我正在创建BOOK_Issue表,其中包含发给该书的人的ID。 我有一个列名user_id女巫将包含来自tbl_student以及tbl_faculty的id。所以如何参考两个主键列设置book_issue表的user_id字段。
答案 0 :(得分:2)
您的数据库架构不正确。
如果您期望唯一ID,那么它们应该在一个表中。
您可以创建一个包含所有用户的表格,并设置一个列来设置其类型(学生,教师)。然后为每种类型创建2个不同的表,根据其类型为每个用户提供适当的信息。
答案 1 :(得分:0)
创建一个“人”超类,可以是“学生”类型,也可以是“教师”类型。请改为从BOOK_Issue
表中引用 this 。
基本上,要创建这种关系,您需要一个跨越“学生”和“教师”的唯一ID。把它放在一个表(tbl_person
?)中,让tbl_student
和tbl_faculty
中的每一行都引用这个新表。最好还是将tbl_student
和tbl_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”的用户 //这可能会更好,这肯定是最初设计的一大改进。