chr*_*roy 18 mysql sql database foreign-keys primary-key
我目前正在为我们团队的项目设计数据库结构.我目前心中有这样一个问题:是否有可能将外键作为另一个表的主键?
以下是我们系统数据库设计的一些表格:
user_accounts
students
guidance_counselors
Run Code Online (Sandbox Code Playgroud)
我想要发生的是,该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代码?
这一直困扰着我,我找不到任何具体或肯定的答案.
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
两次,每列一次,并在组合时分配两个不同的别名,以便区分它们.