昨天和今天,我研究了下Neeps數據庫,復習了一下Sql語句的查詢操作,發現自己還有蠻多疑惑,有待今后鞏固加強!下面簡單介紹下這個數據庫和自己在學習過程中的心得體會。 "Neeps"數據庫包含了Napier大學計算機學院2000/2001 學年的第一學期所有教學事件的詳細信息。
staff表描述了教職員工的基本信息,包括的字段有組合ID,以及組合姓名,因為一個教學活動可能由多個教師來完成 ,這樣描述既合乎常情,又能夠減少數據的冗余。其中主鍵是員工ID.
student表描述了學生的基本信息,包括的字段有學生的ID,班級名稱,班級規模,以及所在班級所屬年級,這里學生的ID是指學生年級與所在班級的組合,如我們平常所說的2005級數據庫6班,而班級名稱則是課程名稱與班號的組合,如平常我們所說的數據結構1班。主鍵是學生ID.
room表描述了教室的基本信息,包括的字段有教室ID,教室名稱,容量(座位數),以及所屬的教室組合,這所以有這么一個字段,我個人認為是通過查詢教室信息進而查詢這個教室是進行哪個教學活動,有沒有和其他教學活動沖突。
event表是整個數據庫最核心的一張表。通過它,可以描述整個教學過程中的所有事件。包括的字段有事件ID,由學科名稱和教學種類及班號(教學T01還是演講L01)所組合而成,學科ID,教學種類(T/L),星期,活動開始時間,持續時間以及所在教室。
modle表描述課程的基本信息。包括的字段有課程ID以及課程名稱。
week表描述了教學周的開始時間信息。包括的字段有教學周ID,教學周開始日期。
attends是用于建立學生與教學事件之間多對多聯系的連接表,包括的字段有學生ID,事件ID.
teaches是用于建立教師與教學事件之間多對多聯系的連接表,包括的字段有教師ID,事件ID.
occurs用于建立教學事件與事件所在日期之間的多對多聯系,包括事件ID以及教學周ID。
這個數據庫設計最大的亮點和巧妙之處就在于對于教學事件時間信息的設計。在event表里面我們只能查詢到事件發生的星期,開始時間以及持續時間,這也符合我們日常的教學習慣。我們一般問星期幾有什么課,在哪里上,什么時候開始,上課時間持續多長。但是光這樣設計還是不夠的,仔細想想就明白了。因為課并不是每個教學周都上,它只發生在某些教學周。所以就有了occurs這張表的存在,它建立了教學事件與教學周之間的對立關系。但是為了進一步了解到每個教學周的開始時間,我們又設計了一張數據表week。這樣整個教學事件發生的時間就這樣一步一步被完整的描述出來了!
下面的關于這個數據庫的練習,給出了部分參考答案,不知道大家有沒有更好的寫法。
通過ER圖和表數據讀懂該數據庫的表與表之間的關系,本數據庫主要用途是用來安排教學活動的,包含了教師、學生集體和教學活動、教室、課程、課時的關系
找出安排給某個教學活動的教室名(例如編號為co42010.L01的教學活動)。
Select name
from room join event
on room.id=event.room
where event.id='co42010.L01'
找出中某課程所包含的所有教學活動發生的日期,時間和地點。(例如編號為co72010的課程)
select wkstart,dow,tod,duration,room
from modle join event
on modle.id=event.modle
join occurs
on event.id=occurs.event
join week
on week.id=occurs.week
where modle.id='co72010'
找出某課程對應的教學活動中所有教師的集合(例如編號為co72010的課程)。
select staff.id,staff.name
from event join teaches
on event.id=teaches.event
join staff
on staff.id=teaches.staff
where modle='co72010'