2013-02-24 2 views
1

나는 4 학기 학생이며 각 과목의 출석에 대해 우려하고 있습니다. 다른 학기 학생들은 배치로 그룹화됩니다. 각 배치에는 36 개의 과목 중 하나의 과목을 선택할 수있는 옵션이 있습니다.데이터베이스에 출석 저장

먼저 제목 코드가있는 네 개의 일괄 처리를 모두 나열한 테이블 subject을 만들었습니다. 나는 다른 테이블을 가지고있다 student 내가 가지고있는 studentid와 학생들에 의해 선정되는 주제 코드를 가질 것 인 6 개의 칼럼이있다. 참여를 통해 나는 학생이 선택한 과목을 알 수 있습니다.

이제는 일상적인 출석을 어떻게 깨끗하게 저장할 수 있는지 알 수 없습니다. 365 일과 1500 명 이상의 학생들의 데이터를 저장해야하므로 길을 제안하십시오. (일요일은 일괄 휴가가 아닙니다).

Storing attendance records in the database 등 몇 가지 관련 주제를 찾았지만 해결책을 찾지 못했습니다.

답변

3

나는 이런 일이있을 것이다. 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 
+0

내 상황에 따라 최소 4 개의 수업과 최대 6 개의 수업이 하루에 열립니다. 그래서'studentAttendance' 테이블은 학생 당 6 * 365 레코드와 6 * 365 * 1500 레코드를가집니다. 성능 문제가 발생합니까? 날짜 정보도 저장하고 싶다면 저장하는 가장 좋은 방법은 무엇입니까? – NewUser

+0

감사합니다. 출석을 저장 한 후에 알아 내려고했을 모든 세부 사항을 주셨습니다. 나는'@ subjectId'의 관례에 익숙하지 않습니다. 그것은 프로그램에 삽입 할 변수를 의미합니까? – NewUser

+0

각각의 'StudentAttandance' 엔트리가 32 바이트 ('StudentId '의 경우 8, ClassId의 경우 8, 내부 데이터베이스의 경우 16)라고 가정하고 데이터베이스에 100 % 효율적인 패킹을 가정하면이 데이터베이스 테이블은 더 크지 않을 것입니다 3.2MB보다.'ClassId'와'StudentId' 칼럼에 필요한 역방향 조회 색인을 추가하면 약 9MB로 세 배가되기를 원할 것입니다. RDBMS는 이러한 색인을 관리하므로 걱정할 필요가 없습니다. – Dai

0

외래 키가있는 조인 테이블을 날짜 필드와 함께 학생과 주제에 모두 만들고 특정 날짜에 특정 클래스에 참석하는 학생을위한 행을 저장하십시오. 적절한 인덱싱을 사용하면 성능이 수용 가능해야합니다. Classes은 학교 일정에 예약 된 각 클래스에 대한 기록을 포함,

Subjects(SubjectId PK, Name, etc...) 
Classes(ClassId PK, SubjectId, DateTime periodBegin, etc...) 
Students(StudentId PK, Name, etc...) 
StudentAttendance(StudentId PK, ClassId PK) 

Subjects 각 과목에 대한 기록이 포함되어