双向学校时间表架构

时间:2014-09-14 21:41:50

标签: sql database

大家好好读这个!

我真的需要通过SQL或Microsoft Access创建双向时间表数据库的帮助!我当然通过谷歌搜索完成了我的作业,但答案看起来不够清晰,并且不是很好。我也尝试制作一个ERD图并对我的数据库进行原型设计,但不幸的是我试图制作一个,但它对我没有意义,所以我最终删除了它。

所以基本上我想创建一个双向时间表,其中有第1周或第A周和第2周或B!这与网站非常相似:http://timetable2calendar.com/two-week-timetable-beta/ 我需要以某种方式检索当前日期,并确定它是否是第1周或第2周。

例如:

如果是

1/09/2014然后是第1周或A。

如果是的话 2014年9月8日那将是第2周或B。

所以这是我的桌子:

**Student:**

StudentID [PK]

Forename 

Lastname 

Year

Group



**Subject:**

SubjectID [PK]

Subject

Room


**Educator:**

EducatorID [PK]

Forename

Lastname

到目前为止,这是最简单的部分,但现在我遇到了我如何排序的困难部分。这是我的不良尝试,我尝试过查看模式和其他ERD图表,但他们没有找到我想要的东西。

Student Timetable:
TimetableID [PK]
StudentID [FK]
SubjectID [FK]
EducatorID [FK]
Weekday (e.g. Mon,Tue,Wed,Thu, Fri)
Period (Peroid 1 - 08:45, Peroid 2 - 09:15, Peroid 3 - 10:00 etc..)
Week (is it Week 1 or 2?)

如果有人能帮助我,我会很感激。请不要建议执行此操作的开源软件,我想为它创建一个数据库。

感谢。

1 个答案:

答案 0 :(得分:2)

根据您的方法,您可以规范人。

你的不良尝试"走在正确的轨道上。可以通过标准化日期和添加位置来改进它。业务键(a.k.a.主键)在开始时间之前完成。

Person
    PersonID [PK]
    Forename
    Lastname

Student
    StudentID [PK]
    PersonID [FK]
    Year
    Group

Educator
    EducatorID [PK]
    PersonID [FK]


Subject 
    SubjectID [PK]
    SubjectName


Location
    LocationID [PK]
    Room Number
    Building    

Calendar    
    CalendarDate [PK]
    DayOfWeek   
    WeekNumber

Timetable
    SubjectID [PK][FK] 
    CalendarDate[PK][FK]
    LocationID [PK][FK]
    StudentID [PK][FK]
    EducatorID [PK][FK]
    StartTime [PK]
    EndTime

此外,这里有一个SQL Server查询来填充Calendar表数据:

DECLARE @CalendarStartDate DATETIME, @MonthsToGenerate INT
SELECT @CalendarStartDate = '2010-01-01', @MonthsToGenerate = 60;


WITH CalendarCTE (CalendarDate,DayOfWeek,WeekNumber)
AS (
    SELECT @CalendarStartDate AS CalendarDate, DATEPART(weekday,@CalendarStartDate) AS DayOfWeek , DATEPART(week,@CalendarStartDate) AS WeekNumber
    UNION ALL
    SELECT DATEADD(day,1,CalendarDate) AS CalendarDate, DATEPART(weekday,DATEADD(day,1,CalendarDate)) AS DayOfWeek , DATEPART(week,DATEADD(day,1,CalendarDate))  AS WeekNumber
    FROM CalendarCTE
    WHERE DATEADD(day,1,CalendarDate) < DATEADD(month,@MonthsToGenerate,@CalendarStartDate) 
)
SELECT *
FROM CalendarCTE
OPTION (MAXRECURSION 32767)

我也把它放在SQLFiddle上。