我正在尝试为 MySQL 中的课程创建时间表。列是星期几,行是时间间隔(即 7:00 - 8:00)。我还尝试设置 30 分钟的时间间隔,当特定主题为 2 小时时,它将跨越 4 行。每个单元格包含课程和房间的名称。这是我正在尝试开发的一个小程序的一部分。到目前为止,我知道要插入哪些数据,但我一直坚持创建正确的数据库模式。真的需要关于如何开始的逻辑(即我应该使用什么数据类型)。谢谢!
4 回答
列是星期几,行是时间间隔(即 7:00 - 8:00 )
这是一个糟糕的开始。您的列应该是单个课程的属性,并且您的行应该是整个星期的所有不同课程。
您的列可能是Day of Week
, Lesson of Day
, Duration
, Subject
, Room
, Teacher
, 等等。在此示例中,您的主键是(Day of Week, Lesson of Day)
.
这样,如果您想要特定日期的日程安排,您只需选择所有内容Day of Week = 2
以获取星期二的日程安排。
每个单元格包含课程和房间的名称。
这也违反了正常化规律。每个“单元格”的值应始终不超过一个。
真的需要关于如何开始的逻辑(即我应该使用什么数据类型)
使用最直观的类型。当你存储一个数字时选择integer
,当存储几个字符时选择varchar(n)
,当使用大量字符时使用text
等等......
我会以这种方式创建它,使其标准化并提供更多机会进一步扩展此应用程序。表(属性):
timeslots(id, start_time, end_time)
subjects(id, name)
timetable(timeslot_id, subject_id)
这听起来如何:
CREATE TABLE TimeTable (
ID int(8) NOT NULL AUTO_INCREMENT,
Subject varchar(32) NOT NULL,
Room varchar(8) NOT NULL,
StartTime datetime NOT NULL,
EndTime datetime NOT NULL,
Day enum('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday') NOT NULL,
PRIMARY KEY (ID)
);
您只存储有关主题的数据。
您提到的其他内容实际上取决于您用于输出数据的任何语言。您不能真正将间隔放在数据库的中间。正如 Damien_The_Unbeliever 所说,数据库并不完全是电子表格。
希望这是有道理的。
您可以设置一列代表天(您可以设置从 1 到 7 的天数),一列代表开始时间,一列代表结束时间。这样您的查询将变得更加简单。
例子:
Day | Start | Finish
-----------------------------
1 8:30 12:00
1 13:00 15:00
当您不想坚持 30 分钟时,这也会派上用场。