当然.这是一种称为
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表两次结合起来,每一列一次,并且在组合它们时分配两个不同的别名,以便将它们分开.