我目前正在为我们团队的项目设计数据库结构。我目前心中有这样一个问题:是否有可能将外键作为另一个表的主键?
以下是我们系统数据库设计的一些表格:
user_accounts
students
guidance_counselors
我想要发生的是user_accounts
表应该包含ID(系统的登录凭证)和学生用户以及辅导员用户的密码。简而言之,students
和guidance_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代码?
这一直困扰着我,我找不到任何具体或肯定的答案。
答案 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)
是的,应该没有问题。外键和主键彼此正交,一列或一组列都可以作为该表的主键(这要求它们是唯一的)并且还与主键/唯一约束相关联在另一张桌子里。