簡體   English   中英

什么是出勤數據庫的良好數據庫設計(架構)?

[英]What is a good database design (schema) for a attendance database?

我正在努力申請保持親戚武術工作室的出勤率。 我已經嘗試過尋找一些類似的例子,但我找不到任何特定的或足夠明確的這類應用程序。

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

我試圖這樣做,因此可以看到以類似日歷的格式出席。 僅列出365天的列可能會很糟糕......而且每個月都有一張表。 我注意到一些類似的應用程序只是跟蹤日期,並將其存儲在數據庫中。 這種方法會更好嗎? 或者,是否有其他更好的方法來設計這種數據庫? 提前致謝。

在武術中,教師也是學生 - 因此Instructor表被子類型化為Student表。 所有公共字段都在Student表中,並且只有教師特定的列位於Instructor表中。

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

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

ClassSchedule描述了學校提供的已發布課程安排。

Attendance表中捕獲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 ;

替代文字

希望這能讓你開始。

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

您還可以創建一個課程表,在這種情況下,考勤表將是id,student_id和lesson_id,課程表可以是id,held_on_date

除非您需要在課程表中添加更多列,否則我認為這是過度的。

后退一點,你有兩種類型的實體:

  • 一個人[像學生]
  • 事件[像一個班級]

將任何實體視為現實世界中存在的東西。

和一個關系

關系就是實體之間的關聯,並且通常具有與之關聯的時間數據或其他類型的度量

所以不要太費勁,你應該有3個數據庫表:

  • 與會者[E]
  • 班級[E]
  • 出勤率[R]

E =實體,R =關系

如果您發現自己在其中一個實體表中復制數據,這是一個好的跡象,表明該實體需要“子模型”。 在某些地方,這稱為“不要重復自己”或DRY,對於實體關系建模,這稱為“數據規范化”。

請記住,構建更精細的架構在時間和代碼方面都有開銷。 所以考慮從簡單的[3個表]開始並重構冗余。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM