我正在为学校管理设计一个数据库。
这里不是一所学校,而是多所学校,有自己的学生、班级、老师和科目。
这是要求。
•一所学校可以有许多课程
•一个类可以有许多子类
•许多学生可能属于一个班级的一部分
•许多教师可能属于一个班级的一部分
•许多科目可以属于一节课
•学校想要管理班级
•学校希望管理部门
•学校希望管理一节课中的科目
•学校希望为班级的某个部分指定一名教师
•学校可以给学生分配一节课
另外,有些学校可以有一、二、三个班,有些学校可以有一、二、三个班。也同样适用于部分或子类
对于学校和老师来说,事情是直截了当的。下面是我的方法。
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
3条答案
按热度按时间t0ybt7op1#
不,它不是“反模式”。连接表可能有两个以上外键的示例有很多:
医生的预约可能有医生、病人和诊所。
零售订单可能有客户、地点和付款类型。
在线订阅可能有客户id、产品、付款类型和来源。
这些只是其他领域的一些例子(它们甚至不包括日期维度)。一个表有多个外键并不少见。
thigvfpy2#
由于时间限制,我没有分析你的模式。
但是,无论从关系的Angular 还是从sql的Angular 来看,表或连接表有两个以上的外键都没有问题。事实上,这很常见。
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