mysql - 需要对数据库模型的建议
问题描述
我有一个类似 udemy 的网站,里面有五个科目
- 物理
- 化学
- 数学
- 英语
- 生物学
并有五个名为
- 8级
- 第9类
- 10级
- 11 级
- 12级
每个班级都与这五个科目有关系。老师可以根据自己的选择将视频上传到这些科目中的任何一个。例如,他想为physics
in上传视频class9
。老师也与学科和班级有关系。我已经为这个数据库考虑了一天多,但结果却是这样。我为每个班级制作了五个单独的表格,所有表格都包含五个科目
请推荐一个好的数据库模型
解决方案
为班级、科目和教师创建一个表格。就像是:
CREATE TABLE class
(id integer AUTO_INCREMENT,
name varchar(64),
PRIMARY KEY (id));
CREATE TABLE subject
(id integer AUTO_INCREMENT,
name varchar(64),
PRIMARY KEY (id));
CREATE TABLE teacher
(id integer AUTO_INCREMENT,
givenname varchar(64),
surname varchar(64),
PRIMARY KEY (id));
还为视频创建一个表。包括上传它的老师。
CREATE TABLE video
(id integer AUTO_INCREMENT,
title varchar(64),
content varbinary(65535),
uploader integer,
PRIMARY KEY (id)
FOREIGN KEY (uploader)
REFERENCES teacher
(id));
然后创建一个将科目链接到班级的表格。包括在课堂上教授该科目的老师。
CREATE TABLE class_subject
(class integer,
subject integer,
teacher integer,
PRIMARY KEY (class,
subject),
FOREIGN KEY (class)
REFERENCES class
(id),
FOREIGN KEY (subject)
REFERENCES subject
(id),
FOREIGN KEY (teacher)
REFERENCES teacher
(id));
如果一门学科只能由一位老师在课堂上讲授,则包括teacher
在主键中。
还要创建一个表格,将视频链接到课程和主题。
CREATE TABLE class_subject_video
(class integer,
subject integer,
video integer,
PRIMARY KEY (class,
subject,
video),
FOREIGN KEY (class,
subject)
REFERENCES class_subject
(class,
subject),
FOREIGN KEY (video)
REFERENCES video
(id));
如果只允许教师将视频分配给一个班级和科目,并且他们还为该班级教授该科目,则您需要对(class, subject, teacher)
of设置一个唯一约束class_subject
(除非(class, subject, teacher)
已经是暗示它是唯一的主键),添加一个teacher
列class_subject_video
并将外键从 更改(class, subject) REFERENCES class_subject (class, subject)
为(class, subject, teacher) REFERENCES class_subject (class, subject, teacher)
。
如果视频不应链接到课程中的主题,而只能链接到一般主题,请不要创建将视频链接到课程和主题的表格,而是创建将视频链接到主题的表格。
CREATE TABLE subject_video
(subject integer,
video integer,
PRIMARY KEY (subject,
video),
FOREIGN KEY (subject)
REFERENCES subject
(id),
FOREIGN KEY (video)
REFERENCES video
(id));
那应该给你一个想法。可能根据您的需要修改数据类型和对象名称。如果需要,添加其他列。等等。
推荐阅读
- heroku - 如何将 react+nodeJS/express 上传到 heroku
- python-3.x - 平衡二叉树的预排序遍历
- makefile - 有没有办法在 makepp 文件中打开 ifdef/ifeq/else/endif 配对检查?
- python - Google CloudSQLAdmin - 服务帐户没有存储桶所需的权限
- dart - 如何在 Flutter 上将 DatePicker 上的可选日期设置为 3 天?
- reactjs - React 组件方法引用应该在组件卸载中清除吗?
- linux-kernel - 尝试在 /dev 中打开设备文件然后我得到:open() failed with error [No such device]
- python - dlib(setup.py)循环的构建轮
- ios - 为什么共享视频只发送到其他一些应用程序?
- android - 使用带有旋转的android中的画布创建一个有4个段的圆