首先,想问你(所以我的问题会更清楚)如果有一个在线数据库图表工具(?),我可以在其中输入我的sql代码,它将绘制diagramm (有表和他们的关系)对我来说。
我找到this question并尝试了一些工具,但大多数工具只能在它们之间创建表和关系,但不允许导入我的sql。
(2) 我需要让所有课程与教师联系。 有两种类型的连接:老师可能是形式大师或老师可能是这个类。 如何获得与老师相关的所有课程。
(3)另外还有一个问题:我是否适合约束?
SQL Scheme(scheme on sqlfiddle.com):
CREATE TABLE `Subject` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
);
CREATE TABLE `Teacher` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`firstname` VARCHAR(50) NOT NULL,
`midname` VARCHAR(50) NOT NULL,
`lastname` VARCHAR(50) NOT NULL,
`address` VARCHAR(100) NOT NULL,
`birthdate` DATE NOT NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE `Class` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`digit` INT(11) NOT NULL,
`char` VARCHAR(50) NOT NULL,
`teacher_id` INT(11) NOT NULL,
PRIMARY KEY (`id`),
INDEX `FK_Class_Teacher` (`teacher_id`),
CONSTRAINT `FK_Class_Teacher` FOREIGN KEY (`teacher_id`) REFERENCES `teacher` (`id`)
);
CREATE TABLE `ClassVsSubject` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`subject_id` INT(11) NOT NULL,
`class_id` INT(11) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `subject_id_class_id` (`subject_id`, `class_id`),
INDEX `FK_ClassVsSubject_Class` (`class_id`),
CONSTRAINT `FK_ClassVsSubject_Class` FOREIGN KEY (`class_id`) REFERENCES `class` (`id`),
CONSTRAINT `FK_ClassVsSubject_Subject` FOREIGN KEY (`subject_id`) REFERENCES `subject` (`id`)
);
CREATE TABLE `TeacherVsSubject` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`teacher_id` INT(11) NOT NULL,
`subject_id` INT(11) NOT NULL,
PRIMARY KEY (`id`),
INDEX `FK_TeacherVsSubject_Teacher` (`teacher_id`),
INDEX `FK_TeacherVsSubject_Subject` (`subject_id`),
CONSTRAINT `FK_TeacherVsSubject_Teacher` FOREIGN KEY (`teacher_id`) REFERENCES `teacher` (`id`),
CONSTRAINT `FK_TeacherVsSubject_Subject` FOREIGN KEY (`subject_id`) REFERENCES `subject` (`id`)
);
答案 0 :(得分:1)
对于第二个问题,请使用以下内容:
select *
from Class
where teacher_id = 1
union
select Class.*
from Class
join ClassVsSubject on Class.id = ClassVsSubject.class_id
join TeacherVsSubject on ClassVsSubject.subject_id = TeacherVsSubject.subject_id
where TeacherVsSubject.teacher_id = 1
由于你没有说明哪个教师是起点,我使用id为1。
请注意,union
删除了重复的条目,无需单独处理。
对于你的数据模型(问题3),我认为你需要在subject
表中针对不同的类和相同的主题(如“数学”或“英语”)需要不同的条目,否则,联接不管用:
让我们说主题“英语”有id 1.现在,如果id为1的类和id为2的类都有这个主题,那么你将在ClassVsSubject中得到以下数据:
class_id subject_id
1 1
2 1
你想如何进入表TeacherVsSubject,id为5的老师在1级教英语,而不是在2级?你不能!如果您输入subject_id 1和teacher_id 5的记录,这将适用于所有类。
要解决此问题,您可以从两个ClassVsSubject
和TeacherVsSubject
制作一个表格。这将是这样的:
CREATE TABLE `ClassVsSubjectVsTeacher` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`subject_id` INT(11) NOT NULL,
`class_id` INT(11) NOT NULL,
`teacher_id` INT(11) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `subject_id_class_id` (`subject_id`, `class_id`, `teacher_id`),
INDEX `FK_ClassVsSubjectVsTeacher_Class` (`class_id`),
INDEX `FK_ClassVsSubjectVsTeacher_Teacher` (`teacher_id`),
INDEX `FK_ClassVsSubjectVsTeacher_Subject` (`subject_id`),
CONSTRAINT `FK_ClassVsSubjectVsTeacher_Class` FOREIGN KEY (`class_id`) REFERENCES `class` (`id`),
CONSTRAINT `FK_ClassVsSubjectVsTeacher_Teacher` FOREIGN KEY (`teacher_id`) REFERENCES `teacher` (`id`),
CONSTRAINT `FK_ClassVsSubjectVsTeacher_Subject` FOREIGN KEY (`subject_id`) REFERENCES `subject` (`id`)
);
对于数据模型,此处不需要id
列,主键可以是所有三个外键的组合键。但是 - 取决于客户端软件 - 拥有它可能很有用。 E. g。一些OR映射工具需要单列主键。
答案 1 :(得分:0)
试试这个:select * from Class where teacher_id = some_id_from_Teacher_table