我目前正在为我们团队的项目设计一个数据库 struct .我现在有一个非常重要的问题:是否可以将外键作为另一个表上的主键?

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

user_accounts
students
guidance_counselors

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

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

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

推荐答案

当然这是一种常见的称为supertyping表的技术.正如在您的示例中一样,一个表包含实体的超集,并具有描述一般实体的公共属性,而其他表包含具有特定属性的这些实体的子集.它与面向对象设计中的简单类层次 struct 没有什么不同.

对于第二个问题,一个表可以有两列,它们分别是同一个表的外键.当数据库构建查询时,它会连接另一个表两次.为了在SQL查询中进行说明(不确定MySQL语法,我很久没有使用它了,所以这是MS SQL语法),在 Select 数据时,您可以给该表两个不同的别名.比如:

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表合并两次(每列一次),并在合并时分配两个不同的别名,以便将它们区分开来.

Database相关问答推荐

如何使用聚合管道从对象数组中获取正确的百分比

使用mongoose 在嵌套对象中查找特定字段

mongodb聚合从另一个查询中获取值

什么是Open Schema的数据库?

SQL Select 用字符串替换整数

当使用多个 WHEN MATCHED 语句时,它们是全部执行,还是只执行一个?

错误:mysqlnd cannot connect to MySQL 4.1+ using the old insecure authentication

将 `tsv` 文件插入 postgresql 数据库

有没有办法在一个脚本中创建多个触发器?

postgresql 在 where 子句中使用 json 子元素

应用程序用户应该是数据库用户吗?

SQLite3 不支持外键约束吗?

如何在远程服务器上备份 MySQL 数据库?

SQLite同时读写

表模块与域模型

MySQL 中 NOW()、SYSDATE() 和 CURRENT_DATE() 之间的区别

Rails 新手,设置 db 然后运行 ​​rake db:create/migrate

对于 N:M 关系,在 MongoDB 中推荐的级联删除等效项是什么?

ManyToOneRel 和 ForeignKey 的区别?

使用 PHP/MySQL 导入 CSV 数据