我正在创建 BOOK_Issue 表,其中将包含该书的发行人的 ID。我有一个列名 user_id 女巫将包含来自 tbl_student 和 tbl_faculty 的 id。那么如何参考两个主键列设置 book_issue 表的 user_id 字段。
4 回答
您的数据库架构不正确。
如果您期望唯一的 ID,那么它们应该在一个表中。
您可以创建一个包含所有用户的表,并有一列来设置他们的类型(学生、教师)。然后为每种类型创建 2 个不同的表,根据用户的类型为每个用户提供适当的信息。
创建一个可以是“student”类型或“faculty”类型的“person”超类。而是从表中引用它。BOOK_Issue
基本上要创建这种关系,您需要一个跨越“学生”和“教师”的唯一 ID。把它放在一个表(tbl_person
?)中,把每一行都放进去tbl_student
并tbl_faculty
引用这个新表。然后最好将两者中存在的字段拉出tbl_student
并将tbl_faculty
它们放入这个新的超级表中。
您可以通过在 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'”条件驱动的子查询。
这应该是您的表格设计:
FacultyTable (FacultyID, FacultyName) StudentsTable (StudentID, StudentName, FacultlyID, ...) BookTable (BookID, BookName, ...) UsersTable(UserID, UserName, UserPassword, StudentID, LastLogin, ...)
现在这是主要的:
BookIssedTable(BookIssedID, BookID, UserID) //这个表告诉我“BookID”的书被发给了“UserID”的用户//这可以更好,因为这肯定比最初的设计有很大的改进。