운동 측정 데이터(줄넘기,윗몸일으키기 등) 저장 구조 설계 중 궁금한게 있는데요. 1 2 1,136

by 펠코스 [DB 모델링/설계] [2015.10.21 20:39:07]


안녕하세요.

웹쪽을 공부하고 있는 초보입니다.

다름이 아니라 이번에 개인의 운동 데이터

줄넘기, 윗몸일으키기 등 각 운동 항목에 대한 데이터를 저장하는 서비스를 구축 중인데요.

데이터 량이 많아질 경우에 대비해 보통 어떻게 구조를 잡는지 궁금하여 이러게 질문 올리게 되었습니다.

 

궁금한 부분이 측정 데이터 값을

1. 한 레코드에 한명의 사용자에 대한 하나의 운동 항목 측정 값을 저장

2. 한 레코드에 운동 항목이 10개라면 10개의 데이터 값을 각 칼럼으로 나누어 저장하는 것이 좋은 구조인지

궁금합니다.

예를 들면 첫번째 방식이라면

보통 하나의 레코드의 각 사용자의 한 운동항목에 대한 데이터를 저장한다면 아래와 같은 구조로

저장하는 것으로 알고있는데요? ( 맞나?.. ㅡㅡ;;;; )

사용자 테이블 { 일련번호, 사용자이름, 사용자회원번호 }

운동 종류 테이블 {     일련번호, 운동이름, 측정단위   } 

측정일 테이블 { 일련번호, 측정일 , 측정목적, 측정인원 }

측정 값 저장 테이블 { 일련번호, 운동종류일련번호 , 측정일일련번호, 사용자일련번호  측정값 }

이렇게 저장할 경우 데이터 량이 많아지면 측정값 저장 테이블에

1000명 * 운동종류(15가지) = 15000 개의 레코드가 생성된다는 건데....

이게 옳은 것인지요?

 

두번째 방법으로 하자니 운동항목의 순서가 변경되거나, 삭제 후 재 추가 되는 상황이 발생한다면

제어가 참 힘들 것 같기도 하구요. 물론 순서 변경이나 항목 이름 변경을 고정시킨다면 두 번째가 좋을 것도

같은데...

문제는 측정 항목이 고정된 부분도 있지만 사용자에 따라 동적으로 추가 되는 기능을 생각하고 있어...

두번째 방법 한 레코드에 다 넣는게 힘들 것 같네요..

 

아 두서없이 글을 적었네요..

 

혹 위와 같은 고민을 해 보신분이 있으시면 조언 부탁드릴게요.

차후를 생각한다면 어떤 부분이 더 좋을까요???

 

 

 

 

 

by 창조의날개 [2015.10.22 14:40:25]


사용자 테이블 { 사용자회원번호, 사용자이름 }

 

: 사용자회원번호 자체가 유니크 해야 하지 않을가요?
그렇다면 구지 또 다른 PK를 만들 필요는 없어 보입니다.

 

운동종류 테이블 { 운동종류ID, 운동이름, 측정단위   } 
측정정보 테이블 { 측정ID, 측정일 , 측정목적 }
측정운동종류 테이블 { 측정ID, 운동종류ID }
측정대상사용자 테이블 { 측정ID, 사용자회원번호 }
사용자측정값 테이블 { 측정ID, 운동종류ID, 사용자회원번호, 측정값 }

 

테이블명과 컬럼명은 가능하면 최대한 명확하고 구분이 가도록 해 주는게 좋습니다.

 

만약 제가 설계 한다면 위 처럼 할 것 같습니다.

 

말씀하신 것과 같이 회원수와 운동종류가 많다면 측정값 테이블의 레코드 수는 당연히 많아 질 것입니다.

 

그러나 그렇게 저장을 해야 필요한 정보를 저장하고 확인 할 수 있습니다.

 

측정정보 테이블의 측정인원은 측정대상사용자 테이블에서 구할 수 있으므로 따로 컬럼으로 만들지 않습니다.

 

측정운동종류, 측정대상사용자 테이블을 따로 만든 이유는..

 

측정하기 위한 운동종류가 무엇이 있는지 알아야 측정시 해당 운동들에 대해서만 화면을 구할 수 있으며..

 

측정 대상 사용자에 대한 정보를 따로 가지고 있어야 해당 사용자들을 관리 할 수 있을 것 입니다.

 

그렇게 관리된 내용으로 측정값은 해당 정보들의 집합이 되겠네요..

 

개인적인 의견입니다.

참고해 보시기 바랍니다.

 

 

 


by 펠코스 [2015.10.23 08:56:14]

답변 감사합니다.

다시 생각해보니 한 레코드에 운동 갯수 만큼의 필드를 만들어 넣는 방법은 데이터 량은 적게 유지가 될 듯 하나 사용성 부분에서 구조가 좋지 않을 것으로 생각되었습니다.
물론 필드 단위로 넣는 방법은 구상해 두었지만.....흠.. 과연 옳은 것인지... 판단이 안되는군요.

때문에 두 가지 방법을 다시 생각해 보았는데요.

창조님과 같이
첫번째.
측정정보 테이블 { 측정ID, 측정일, 측정목적 }
운동 종류 테이블 { 운동ID, 운동이름, 단위 }
사용자 테이블 { 사용자ID , 이름, 주소 , 전화번호 }
사용자 측정값 테이블 { 측정ID, 운동ID, 사용자ID, 측정 값 }
테이블을 세분화 한 것과

두번째
측정정보 테이블 { 측정ID, 측정일, 측정목적 }
사용자 테이블 { 사용자ID , 이름, 주소 , 전화번호 }
사용자 측정값 테이블 { 측정ID, 사용자ID, JSONDATA(운동 종류별 측정 값) }
운동 종류별 값을 Json 형태로 저장하여 파싱해서 사용할 수 있도록 생각해 보았습니다.

테이터 량은 월별 이든 년도 별이든 테이블을 나누어 정리하면 어느정도 분산이 될 것으로 보이며,
두번째 방법의 경우 운동 종류 별로 세세하게 쿼리로는 힘들 것으로 보여
첫번째 방법으로 가려고 생각 중입니다.

그게 맞겠죠? ㅎ;;;

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입