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