我有這樣的事情:
Subjects(SubjectId PK, Name, etc...)
Classes(ClassId PK, SubjectId, DateTime periodBegin, etc...)
Students(StudentId PK, Name, etc...)
StudentAttendance(StudentId PK, ClassId PK)
Subjects
包含每個科目的記錄,Classes
包含在校歷安排每個班級的記錄。 Classes
表需要用實際的課程組件填充 - 您可以在課程開始時添加它們,也可以在學年開始時批量添加它們。 Students
表是不言自明的,StudentAttendance
表列出了哪些學生積極參加特定班級。
不要認爲像StudentAttendance
這樣的表是不好的設計 - 這是多對多連接表的典型示例。看到一些在連接表中有數十億行的數據庫並不罕見,但是因爲它只包含兩個鍵值(大概是int32或int64),所以它不會在磁盤上佔用太多空間。
下面是發現哪些學生沒有參加具體類的查詢:
SELECT
Name
FROM
Students
WHERE
StudentId NOT IN (
SELECT
StudentId
FROM
StudentAttendance
INNER JOIN Classes ON StudentAttendance.ClassId = Classes.ClassId
WHERE
StudentAttendance.ClassId = @classId
)
這裏有一個查詢,獲取考勤計數爲每個學生誰參加了一個特定的主題。除以(SELECT Count(*) FROM Clases WHERE Classes.SubjectId = @subject
)以獲得每個學生的出勤率。如果學生從未參加任何課程(故意或因爲他們未註冊),則他們將不會出現在列表中。
SELECT
Students.Name
COUNT(*) As AttendanceCount
FROM
StudentAttendance
INNER JOIN Classes ON Classes.ClassId = StudentAttendance.ClassId
INNER JOIN Students ON Students.StudentId = StudentAttendance.StudentId
GROUP BY
StudentId
WHERE
Classes.SubjectId = @subjectId
來源
2013-02-24 08:55:41
Dai
在我的情況下,每天最少4班,最多6班。那麼'studentAttendance'表每個學生將有6 * 365條記錄和6 * 365 * 1500條記錄總數?它會導致任何性能問題?如果我想存儲日期信息,那麼存儲它的最佳方式是什麼? – NewUser 2013-02-24 09:01:21
謝謝..你剛剛提供了所有的細節,我將試圖找出存儲出席後。我不習慣'@ subjectId'的約定是否意味着它將被嵌入到程序中? – NewUser 2013-02-24 09:07:08
假設每個'StudentAttandance'條目消耗32個字節('StudentId'爲8,'ClassId爲8',內部數據庫使用爲16),假設數據庫中有100%的高效包裝,那麼給出的估計數據庫表不會更大比3.2MB。如果您爲'ClassId'和'StudentId'列添加必要的反向查找索引,那麼您可能需要將其增加到9MB左右 - 您的RDBMS將管理這些索引,因此您不必擔心它們。 – Dai 2013-02-24 09:07:17