0

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

4

4 回答 4

2

您的数据库架构不正确。

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

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

于 2009-11-24T05:03:53.850 回答
0

创建一个可以是“student”类型或“faculty”类型的“person”超类。而是从表中引用它。BOOK_Issue

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

于 2009-11-24T04:39:30.153 回答
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'”条件驱动的子查询。

于 2009-11-24T04:53:12.717 回答
0

这应该是您的表格设计:

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

现在这是主要的:

BookIssedTable(BookIssedID, BookID, UserID) //这个表告诉我“BookID”的书被发给了“UserID”的用户//这可以更好,因为这肯定比最初的设计有很大的改进。

于 2009-12-17T11:58:56.057 回答