外键可以作为主键吗?

时间:2013-07-14 02:52:11

标签: mysql sql database foreign-keys primary-key

我目前正在为我们团队的项目设计数据库结构。我目前心中有这样一个问题:是否有可能将外键作为另一个表的主键?

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

user_accounts
students
guidance_counselors

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

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

这一直困扰着我,我找不到任何具体或肯定的答案。

2 个答案:

答案 0 :(得分:22)

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

对于第二个问题,一个表可以有两列,它们是同一个其他表的外键。当数据库构建查询时,它会将其他表连接两次。为了说明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表组合两次,每列一次,并在组合时分配两个不同的别名,以便区分它们。

答案 1 :(得分:2)

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