2010-10-15 71 views
9

我正在試着申請一個親戚的武術工作室。我嘗試過尋找一些類似的例子,但是我找不到任何具體的或足夠清晰的例子。什麼是考勤數據庫的優秀數據庫設計(模式)?

目前,我使用兩個表格,一個用於保存學生信息,學生(id,first_name,last_name,email,...),另一個表格用於出席一週的一週,出勤(id ,week_1,week_2,week_3,...)。我試圖改變它,以保持出席數天,但似乎無法想到一個好方法,因爲我還是一個MySQL的新手。

我想使它能夠以類似日曆的格式查看出席情況。在365天內製作專欄可能會很糟糕......並且每個月都有一張表格。我注意到一些類似的應用程序只是跟蹤日期,並將其存儲在數據庫中。這種方法會更好嗎?或者,還有其他更好的方法來設計這種類型的數據庫嗎?提前致謝。

回答

5

出勤應該有id,student_id和日期。這是學生出席時需要記錄的全部內容。如果您想知道在特定日期(和誰)上有多少學生參加了該特定日期或日期範圍的查詢。

您還可以創建一個教訓表,在這種情況下,考勤表是 ID,student_id數據和lesson_id 課程表可以 ID,held_on_date

,除非你需要添加更多的列到的教訓表,我認爲這是矯枉過正。

+0

您的回答和Damir的回答已經回答了我所有的問題。感謝您的幫助。 – 2010-10-16 00:49:59

14

在武術中,導師也是學生 - 所以Instructor表被分爲Student表格。所有常見字段均在Student表中,只有教師特定的字段位於Instructor表中。

Art表格有學校提供的藝術列表(柔道,空手道......)。

學校可能有幾個房間,這些都列在Room表中。

ClassSchedule描述了學校提供的課程的公佈時間表。

考勤記錄在Attendance表中。

Calendar表中的一行是一個日曆日(日期)。該表具有日期屬性,如DayOfWeekMonthNameMonthNumberInYear等在TimeTable

一行是一天一分鐘,喜歡7:05。

日曆和時間表允許通過的日期/時間容易考勤報表,例如

-- Attendance of judo morning classes 
-- for the first three months of the year 2010 
-- by day of a week (Sun, Mon, Tue, ..) 
select 
    DayOfWeek 
    , count(1) as Students 
from ClassSchedule as a 
join Calendar  as b on b.CalendarId = a.CalendarId 
join TimeTable  as c on c.TimeID  = a.StartTimeId 
join Attendance as d on d.ClassId = a.ClassID 
join Art   as e on e.ArtId  = a.ArtID 
where ArtName = 'judo' 
    and Year = 2010 
    and MonthNumberInYear between 1 and 3 
    and PartOfDay = 'morning' 
group by DayOfWeek ; 

alt text

希望這可以讓你開始。

+2

日期表是一種數據存儲技術。對於一個自稱是mySQL新手的人來說,這可能會讓人感到困惑。強烈建議不要使用日曆維度,而正常的日期列在事務數據庫中會很好。 – 2010-10-15 15:56:42

+2

還有一個時間維度......你究竟想要做這個新手呢? – 2010-10-15 15:59:14

+2

@Stephanie - 那麼,你對丹尼爾有多瞭解,以及你認爲他無法理解這一點? – 2010-10-15 16:27:05

0

步後退了一點,有兩種類型的實體:

  • 人[像個學生]:
  • 事件[如類]

認爲任何實體的東西的存在於現實世界中。

而一個關係

  • 出席

的關係就是這樣,實體之間的關聯,並經常有時間,或其他類型的措施相關數據。

所以想也沒想太辛苦,你應該有3個數據庫表:

  • 與會者[E]
  • 類[E]
  • 出席[R]

E =實體,R =關係

如果您發現自己在其中一個實體表中複製數據,這是一個好兆頭,實體需要一個「子模型」。在一些地方稱爲「不要重複自己」或DRY,而對於實體關係建模,這稱爲「數據標準化」。

請記住,構建更精細的模式在時間和代碼上都有開銷。所以考慮啓動簡單的[3個表]並重構冗餘。