2009-06-20 5 views
6

저는 특정 모듈이 출석 시스템을 다루는 학교의 프로젝트를 진행하고 있습니다. 나는 개발을 위해 LAMP (PHP 5.2+ MYSQL 5+) 스택을 사용하고있다. 이제 학교의 강도는 약 1500이고 연간 총 근무 일수는 약 250입니다. 또한 지울 수 있기까지 5 년 동안 기록을 유지해야합니다. 단순히 5 년 동안 1,875,000 기록을 의미 하나의 테이블을 사용하는 경우학교 출석 시스템 데이터베이스 설계

테이블 구조는

studentId varchar(12) 
date date 
fn varchar(1) *forenoon* 
af varchar(1) *afternoon* 

입니다. 이제는 엄청난 데이터베이스가 아닌 각 클래스 (섹션이 아님)에 대한 테이블을 만드는 것을 고려했습니다. 따라서 12 개의 클래스가 있다고 가정하면 12 개의 테이블을 가질 수 있습니다. 이는 관리 가능한 테이블 당 평균 1,55,000 개의 레코드를 의미합니다.

올바른 방법인가요? 아니면 더 좋은 방법이 있습니까?

+0

왜 이것을 거창하다고 부릅니까? 공간 제약이 있습니까? 성능에 문제가 있습니까? 벤치 마크를 얻으려면이 행 수를 시뮬레이션 했습니까? –

+0

궁금합니다. fn과 af의 데이터 유형 길이가 다른 이유는 무엇입니까? – cheduardo

+0

@cheduardo, 미안 해요 오타되었습니다 – Checksum

답변

13

(어느 경우)를 보라 무언가이다. 이것은 흔한 실수입니다.

데이터베이스 구조를 현실에 가깝게 만드는 것이 좋습니다. 앞으로 최적화 또는 속도 향상이 필요한 경우 항상 그렇게 할 수 있습니다.

경험을 통해 예제를 살펴보면 단일 테이블 솔루션이 잘 보입니다.

+0

+1 나와 똑같은 말. – TheTXI

+0

+1에 동의하지 않습니다. 여기서 사람들이 보는 많은 질문은 사람들이 조기에 최적화를 필요로하지 않는 것을 최적화했습니다. – cletus

2

테이블 열을 올바르게 인덱싱하면 첫 번째 테이블에 큰 문제가 없어야합니다.

12 개 클래스로 분리하는 아이디어에 동의하지 않습니다. 클래스를 추가하거나 클래스를 병합하는 등의 방법으로 사용할 수 있다고 보장 할 수 없기 때문입니다.

효율성의 인식 이익을 위해 데이터베이스 정상화를 일 처리는 당신이 일을하는 것은시기 상조 최적화라고 극단적 인 상황에 대한

3

몇 점.

  • 2 백만 레코드는 이 아니고 큰 테이블입니다.
  • 클래스 당 별도의 표가있는 경우 은 분명히이 정규화되지 않았습니다.

다른 테이블에 충분한 정보를 제공하지 못했고이 테이블이 저장할 다른 정보가 있다면 무엇이 있습니까? 그러나 모든 테이블에 대해 3NF로 시작해야하며 성능 문제가있는 경우에만이를 변경해야합니다.

2

이 테이블을 나눌 필요가 없음을 제안합니다. 수행해야하는 선택적 조회에 대해 적절한 색인을 작성하면 시스템은 필요한 행을 매우 빨리 찾을 수 있어야합니다. 모든 행을 포함하는 분석 쿼리의 경우에도 2 백만 건의 이러한 레코드는 2 ~ 2 스캔 만 필요하므로 큰 문제는 없을 것입니다.

이제 MySQL은 선택적 기능으로 데이터 파티셔닝을 지원합니다. 파티셔닝은 테이블을 분할하는 제안과 비슷하지만 실제 수준에서 수행되므로 스키마를 사용하는 사용자 또는 개발자에게는 표시되지 않습니다. 단일 테이블 구현이 여전히 너무 느린 경우 유용한 방법이 될 수 있습니다. This document은 MySQL 5.4에서 파티셔닝에 대한 개요를 제공합니다.

+0

파티션 나누기에 대한 정보를 보내 주셔서 감사합니다! – Checksum

0

체크섬,

나는 조기 최적화라고 말합니다.

성능 향상을 위해 기본적으로 나중에 수행 할 수있는 작업은 데이터베이스 아카이브 및 파티션 기능을 사용하여 데이터베이스 읽기가 효율적이라는 것입니다. 이 테이블에서도 인덱스를 만들 수 있습니다. 어쨌든 1 백만 레코드가 거대하다고 나는 믿지 않는다. 오늘날 데이터베이스는 그러한 큰 숫자를 처리 할 수 ​​있습니다. 또한 3 년 형태의 성능 문제가 발생할 것입니다

그래서 무엇이 잘못되었는지 생각하기보다는 코드를 작성하십시오!