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

kx5bkwkv  于 2021-07-29  发布在  Java
关注(0)|答案(3)|浏览(266)

我正在为学校管理设计一个数据库。
这里不是一所学校,而是多所学校,有自己的学生、班级、老师和科目。
这是要求。
•一所学校可以有许多课程
•一个类可以有许多子类
•许多学生可能属于一个班级的一部分
•许多教师可能属于一个班级的一部分
•许多科目可以属于一节课
•学校想要管理班级
•学校希望管理部门
•学校希望管理一节课中的科目
•学校希望为班级的某个部分指定一名教师
•学校可以给学生分配一节课
另外,有些学校可以有一、二、三个班,有些学校可以有一、二、三个班。也同样适用于部分或子类
对于学校和老师来说,事情是直截了当的。下面是我的方法。

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

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

但我在为一所学校绘制班级和部门Map时遇到了一个问题。
我试着制作另外两个实体的班级和部门,给他们一把学校的外键

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

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

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

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
t0ybt7op

t0ybt7op1#

不,它不是“反模式”。连接表可能有两个以上外键的示例有很多:
医生的预约可能有医生、病人和诊所。
零售订单可能有客户、地点和付款类型。
在线订阅可能有客户id、产品、付款类型和来源。
这些只是其他领域的一些例子(它们甚至不包括日期维度)。一个表有多个外键并不少见。

thigvfpy

thigvfpy2#

由于时间限制,我没有分析你的模式。
但是,无论从关系的Angular 还是从sql的Angular 来看,表或连接表有两个以上的外键都没有问题。事实上,这很常见。

yhuiod9q

yhuiod9q3#

有些概念,尤其是面向对象的概念,不适合sql。
sql有“only”:
1:1关系(通常不应使用)
1:多(通过一个表中的链接实现到另一个表)
many:many (需要单独的“连接”表)
在每种情况下,“1”可以退化为“0”,“many”可以退化为“1”或“0”。通常“0”不是显式表示的,而是没有行。
要创建架构,请执行以下操作:
想想要有什么“实体”表((学生、班级、学校等)
创造关系,按照1:多和many:many.
(可选)建立 FOREIGN KEYs 对于链接(参照完整性;隐式创建 INDEX )
确保正确的列 INDEXed . (性能)
稍后。。。
写下 SELECTs , UPDATEs 等等。
使用这些查询来决定是否需要其他索引。
你的问题主要是关于many:many tables.
基本many:many table 正好有2列(链接到其他两个表)
基本指数有两个综合指数( PRIMARY KEY(a,b) 以及 INDEX(b,a) )
当然,去吧many:many:多(不常见,但合理)
为有关关系的属性添加列(也不常见,但可以)
为依赖于这些属性的查询添加复合索引(以提高性能)
更多关于many:many: http://mysql.rjweb.org/doc.php/index_cookbook_mysql#many_to_many_mapping_table

相关问题