提问者:小点点

创建一个有两个以上外键的连接表是反模式吗?


我正在为学校管理设计一个数据库。

这里不是单一的学校,而是多所学校,有自己的学生,类,教师和学科。

这是要求。

•一所学校可以有许多类

•一个类可以有许多子类

•许多学生可能属于一个班级的一个部分

•许多教师可以属于一个班级的一个部分

•许多科目可以属于一个班级的一个部分

•学校希望管理类

•学校希望管理部门

•学校希望管理班级中某一个部分的科目

•学校希望为一个班级的某一个部分的某一科目分配一名教师

•学校可以给学生分配一节课

另外,有些学校可以把类命名为一,二,三,有些学校可以命名为一,二,三。 区段或子类也相同

对于实体,学校和教师来说,事情是直接的。 下面是我给他们的方法。

School
--------------
id 
name
...

Teacher
--------------
id
school_id
name

但是我在为一所学校绘制类和分区图时遇到了问题。

我试着让另外两个实体成为类和科,并给他们一个学校的外键

SchoolClass
-----------------
school_id
class_name
...


SchoolSection
----------------
school_id
section_name
...

为了将一个学校的班级映射到它的所有部分,我创建了一个连接表,因为它将是多对多的关系。

SchoolClassSection
---------------------------------------------------------
school_class_id
school_section_id  

但是正如我上面提到的,我还需要在课堂上增加科目和老师,所以我尝试了下面这样的方法。

SchoolClassSections
---------------------------------------------------------
school_class_id
school_section_id
subject_id
teacher_id

但是现在我在结表中有四个外键。

在junciton表中有两个以上的外键没有问题吗?

此外,我也需要添加学生,但我现在不知道如何进一步为学生关系为类,节?

有一件事我可以像下面这样

student
-----------
school_id
school_class_section_id // but if SchoolClassSections can have subject_id and teacher_id too it will become confusing

共2个答案

匿名用户

不,它不是“反模式”。 在许多例子中,连接表可能有两个以上的外键:

  • 医生预约可能有医生,病人和诊所。
  • 零售订单可能有客户,地点和付款类型。
  • 联机订阅可能具有客户id,产品,支付类型和来源。

这些只是来自其他域的一些示例(它们甚至没有包含日期维度)。 一个表有多个外键并不少见。

匿名用户

由于时间限制,我没有分析你的模式。

但是无论从关系的角度还是从SQL的角度来看,对于具有两个以上外键的表或连接表都没有问题。 事实上,这很常见。