23

我目前正在为我们团队的项目设计一个数据库结构。我目前有这个问题:是否可以让外键充当另一个表的主键?

以下是我们系统数据库设计的一些表格:

user_accounts
students
guidance_counselors

我想要发生的是该user_accounts表应包含学生用户和辅导员用户的 ID(假设是系统的登录凭据)和密码。简而言之,表studentsguidance_counselors表的主键也是表的外键user_accounts。但我不确定是否允许。

另一个问题是:一个student_rec表也存在,它的每条记录都需要一个student_number(也就是表user_id中的user_accounts)和一个guidance_counsellor_id(也是user_id中的user_accounts)。如果学生和辅导员的ID都来自user_accounts table,我将如何设计student_rec表格?为了将来参考,我如何手动将其编写为 SQL 代码?

这一直困扰着我,我找不到任何具体或确定的答案来回答我的问题。

4

2 回答 2

30

当然。这是一种称为超类型表的常用技术。与您的示例一样,这个想法是一个表包含实体的超集并具有描述一般实体的通用属性,而其他表包含具有特定属性的这些实体的子集。这与面向对象设计中的简单类层次结构没有什么不同。

对于第二个问题,一个表可以有两列,它们分别是同一个表的外键。当数据库构建查询时,它会连接另一个表两次。为了在 SQL 查询中进行说明(不确定 MySQL 语法,我已经很长时间没有使用它了,所以这是专门的 MS SQL 语法),您可以在选择数据时为该表指定两个不同的别名。像这样的东西:

SELECT
    student_accounts.name AS student_name,
    counselor_accounts.name AS counselor_name
FROM
    student_rec
    INNER JOIN user_accounts AS student_accounts
      ON student_rec.student_number = student_accounts.user_id
    INNER JOIN user_accounts AS counselor_accounts
      ON student_rec.guidance_counselor_id = counselor_accounts.user_id

这基本上将student_rec表格与表格组合user_accounts两次,每列一次,并在组合它们时分配两个不同的别名,以便将它们区分开来。

于 2013-07-14T03:08:14.220 回答
5

是的,应该没有问题。外键和主键相互正交,一列或一组列既可以作为该表的主键(这要求它们是唯一的),也可以与主键/唯一约束相关联在另一张桌子上。

于 2013-07-14T02:58:11.687 回答