我打算为我的大学开设一个考勤门户网站。我已经尝试但是没有成功设计一个高效的数据库。它必须能够记录所有科目,所有班级等的出勤率。 任何线索都将受到赞赏。
答案 0 :(得分:1)
Class --< Lecuture --< Attendance >-- Student
Class
有多个Lectures
,每个Lecture
只属于一个Class
。
每个Student
会参加许多Lectures
,每个Lecture
会有很多Students
参加。
CREATE TABLE class (
class_id INT,
class_name VARCHAR(100),
CONSTRAINT class_id_pk PRIMARY KEY (class_id)
);
CREATE TABLE lecture (
lecture_id INT,
class_id INT,
lecture_dt DATE,
CONSTRAINT lecture_id_pk PRIMARY KEY (lecture_id),
CONSTRAINT lecture_class_id_fk FOREIGN KEY (class_id) REFERENCES class (class_id)
);
CREATE TABLE student (
student_id INT,
student_first_name VARCHAR(20),
student_last_name VARCHAR(20),
CONSTRAINT student_id_pk PRIMARY KEY (student_id)
);
CREATE TABLE attendance (
lecture_id INT,
student_id INT,
attendance_present INT CHECK (attendance_present in (0,1)),
CONSTRAINT attendance_pk PRIMARY KEY (lecture_id, student_id),
CONSTRAINT att_lecture_id_fk FOREIGN KEY (lecture_id) REFERENCES lecture (lecture_id),
CONSTRAINT att_student_id_fk FOREIGN KEY (student_id) REFERENCES student (student_id)
);
要在学生和讲座之间建立M:N
关系,请创建名为association table
的{{1}}。请注意,attendance
的主键是attendance
和lecture_id
,并且这两个字段都有外键返回各自的表。
如果您的数据库具有布尔数据类型,则可以将其用于student_id
。值为False / 0表示学生错过了讲座。值为True / 1表示学生参加。如果您想存储它,也可以包含attendance_present
。
实际上,这还需要一个on_time
表,其中Teacher
表示多对多。可能还需要一个Class
(或主题)表,其中一个对多Course
。还可能有一个Class
表,其中包含一对多Semester
。一个班级也可以有一个学生列表,因此一个Course
关联表是好的。
ClassList