나는 이런 일이있을 것이다. 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
감사합니다. 출석을 저장 한 후에 알아 내려고했을 모든 세부 사항을 주셨습니다. 나는'@ subjectId'의 관례에 익숙하지 않습니다. 그것은 프로그램에 삽입 할 변수를 의미합니까? – NewUser
각각의 'StudentAttandance' 엔트리가 32 바이트 ('StudentId '의 경우 8, ClassId의 경우 8, 내부 데이터베이스의 경우 16)라고 가정하고 데이터베이스에 100 % 효율적인 패킹을 가정하면이 데이터베이스 테이블은 더 크지 않을 것입니다 3.2MB보다.'ClassId'와'StudentId' 칼럼에 필요한 역방향 조회 색인을 추가하면 약 9MB로 세 배가되기를 원할 것입니다. RDBMS는 이러한 색인을 관리하므로 걱정할 필요가 없습니다. – Dai