2013-10-06 2 views
0

나는 PHP [students attendance system handling] 프로젝트에서 일하고있다. 나는 그들의 ID [jntuno]와 함께 학생 목록을 가지고 있고 각 과목마다 각 학생의 매일 출석을 저장하기 위해 mysql에 데이터베이스를 만들어야한다. 나는 이렇게 테이블을 만들었다 :출석을 처리하기위한 테이블 선택

표 : students

FIELDS :

slno int(5) auto increment, 
jntuno char(15), 
name char(50), 
primary key(slno,jntuno). 

자료 :

Data in students table

이 0,123,599

표 : dailyatt

FIELDS :

+------------+-----------+-----------------+------------+-----------+-----------+ 
|date  |subject |classesconducted |11341A0501 |11341A0502 |11341A0503 |.... 
+------------+-----------+-----------------+------=-----+-----------+-----------+ 
|   |   |     |   |   |   | 
:

date date, 
subject char(10), 
classesconducted int(2), 
`11341A0501` int(2), 
`11341A0502` int(2), 
`11341A0503` int(2), 
. 
. 
. 
`11341A0537` int(2), 
primary key(date,subject). 

이 테이블 모양을 19,표는 내가 다른 테이블을 만들어 지금

학생들의 목록과 ID를 보유하고

지금은 매일 입력 PHP 웹 사이트에 출석하면, 그 날 가르치는 각 주제마다 새로운 행이 생깁니다.

하지만 많은 사람들이 데이터베이스 모델이 좋지 않다고 말했습니다 ...
이 데이터베이스 구조에 어떤 문제가 있습니까?

누군가 이러한 유형의 문제에 대해 더 나은 모델을 제안 할 수 있습니까?

+0

(http://en.wikipedia.org/wiki/Database_normalization) 이해 적어도 세 번째 정규 양식 (3NF)을 제출해야합니다. –

답변

3

이미지 학교에 200 명의 학생이 있습니다. 두 번째 테이블에는 200 개 이상의 열이 있습니다. 테이블을 두 개까지 분할해야합니다. 하나는 학교에서 제공되는 모든 수업에 대한 것이고 다른 하나는 실제 출석 기록입니다.

"클래스"테이블

enter image description here

"출석 테이블"

enter image description here

그런 다음 함께 가입 할 수 있습니다. 가에있는 데이터베이스를 사용하는 운영 시스템의 트랜잭션 데이터를 저장하는 것이 좋습니다 이유

SELECT student_id, class_name, date, class_attended 
FROM attendance AS ABB2 
    LEFT JOIN classes AS ABB1 ON ABB1.id = ABB2.class_id 
당신은 데이터베이스 정규화를 공부해야
2

모든 학생을위한 열을 만드는 것은 좋지 않습니다.

왜이 테이블을 만들지 않으십니까?

`date` date, 
`slno` int(5), 
`slnoconducted` int(2), 
`subject` char(10), 
primary key(`date`, `slno`, `subject`) 

그래서, 당신은이 표에 같은 몇 가지 값을 삽입 할 수 있습니다

("2013-10-06", 1, 5, "Class A") 

을 그리고는 다음과 같이 처리됩니다 : 날짜 2013년 10월 6일 slno # 1 학생이 (11341A0501를) "Class A"라는 설명과 함께 slnoconducted == 5를 얻었다.

: 한 학생에 대한 모든 기록을 얻고 싶은 경우에, 당신은 쿼리를 사용할 수 있습니다

SELECT * FROM dailyatt WHERE `date` = '2013-10-06' 

: 당신이 원하는 경우, 예를 들어, 오늘날 모든 레코드를 얻기 위해, 후

, 당신은 쿼리를 사용할 수 있습니다

SELECT * FROM dailyatt WHERE `slno` = 1 

그리고 심지어는 :

SELECT d.*, s.`jntuno`, s.`name` 
FROM `dailyatt` d 
LEFT JOIN `students` s ON d.`slno` = s.`slno` 
WHERE `date` = '2013-10-06' 

이 기록을 처리하는 더 좋은 방법입니다. students 테이블을 변경 한 후에 다른 열을 작성/삭제해야하기 때문에 모든 학생에 대해 열을 작성하면 DB의 유연성을 잃게됩니다.

내가 올바르게 설명했으면 좋겠다. 왜냐하면 내가 좋은 영어를 할 수 있을지 모르겠다.