外键可以作为主键吗?

chr*_*roy 18 mysql sql database foreign-keys primary-key

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

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

user_accounts
students
guidance_counselors
Run Code Online (Sandbox Code Playgroud)

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

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

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

Dav*_*vid 23

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

对于第二个问题,一个表可以有两列,它们是同一个其他表的外键.当数据库构建查询时,它会将其他表连接两次.为了说明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
Run Code Online (Sandbox Code Playgroud)

这基本上取student_rec桌子并将其与表格结合user_accounts两次,每列一次,并在组合时分配两个不同的别名,以便区分它们.


mic*_*slm 5

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