개발 Q&A

제목 [해결]데이터베이스 구조설계에 대한 질문
글쓴이 쿠사 작성시각 2014/12/24 18:47:54
댓글 : 6 추천 : 0 스크랩 : 0 조회수 : 12629   RSS
현재 사이트에 회원가입기능과 그룹만들기 그룹 가입하기 기능을 계획 중입니다.
현재 계획중인 구조는
특정회원이 그룹을 생성하게되면 그룹테이블에 그룹에대한 레코드가 하나 삽입됩니다.
그리고 회원테이블에 그룹명이라는 필드가 있는데 거기에 소속된 그룹명을 입력할 생각입니다.
이렇게 설계를 하게되면 해당그룹의 그룹원들을 조회하기 위해서는 모든회원레코드들을 조회를 해야하는데 이것보다 더 효율적인 설계가 있을까요?
그리고 회원이 아닌 그 그룹 자체의 정보(그룹명, 그룹생성일, 그룹소개 등등)보기기능도 있는데
이때 그룹원들의 평균연령, 회원수(회원정보는 필요없음 그냥 수만) 등도 보기가 되는데
이때에도 저 정보들을 출력하려면 모든 회원레코드를 조회해야 하는것 아닌지요?
생성된그룹리스트보기(그룹명, 그룹생성일, 그룹소개, 그룹평균연령, 그룹회원수 등)가 있어서 한 그룹을 표현할때마다 모든회원테이블을 조회해야된다면 불필요한 자원낭비가 되지 않을까 싶어서....
혹시 이런경우에는 어떤식으로 데이터베이스를 설계하는것이 좋을지 조언 부탁드립니다.
 다음글 mysql 쿼리 질문 합니다. (8)
 이전글 자바스크립트와 제이쿼리 결합 글로벌 함수 가능 한가요 ... (3)

댓글

kaido / 2014/12/24 20:30:20 / 추천 0
DB 설계는 사실상 설계자의 재량이 많이 좌우 되는 부분입니다.

나쁜 설계는 있어도 정답은 없습니다.

이부분은 사수분에게 깨져가면서 배우는게 가장 빠르지 않나 싶어요.

글로 어떻게 표현할 길이 딱히 없네요.

먼저 생각 해보신대로 설계를 하고 평가를 받으시는게 좋을것 같습니다.
쿠사 / 2014/12/24 22:22:54 / 추천 0
kaido // 답변감사합니다. 그런데 혼자서 개발하는 학생이라 물어볼 사수가 없다는게.....

제가 지금 설계한걸 간략하게 요약하자면

클럽테이블 - (그룹명, 그룹마스터아이디, 그룹소개)
-----------------------------
testgroup1, test01, "테스트그룹1소개입니다." 
testgroup2, test02, "테스트그룹2소개입니다."

회원테이블 - (회원아이디, 회원나이, 가입그룹, 등급(1:일반회원, 2:클럽가입회원, 3:클럽마스터))
----------------------------------
test01, 20, testgroup1, 3
test02, 30, testgroup2, 3
test03, 25, testgroup1, 2
test04, 27, testgroup1, 2
test05, 26, null, 1

이런 설계입니다. 이런상태로도 위에서 제가 생각한 기능
1. testgroup1에 속한 회원들의 정보
2. testgroup들의 정보들(그룹명, 그룹마스터아이디, 그룹소개, 그룹평균연령, 그룹원수). 그룹들의 리스트라도 수십줄 출력.
의 정보를 출력할 수는 있으나 지금 생각으로는 DB조회가 지나치게 많이 발생할것 같아서요...(나쁜설계인것같아서...)

그래서 그룹테이블에 총나이와 인원수필드를 추가해서 가입시에 나이와 인원증가(연령은 총나이/인원으로 계산예정)하고
탈퇴시에 총나이와 인원감소를 하면 적어도 그룹리스트출력할때는 회원테이블을 조회하지 않아도 되지않을까... 하고 생각은
해보았는데 얻을수있는값을 중복적으로 쓰는것같기도하고 관리도 불편할것같아서 혹시 더 좋은 방법이 있을까 싶어서 질문드려보았습니다..
kaido / 2014/12/25 04:40:42 / 추천 0
간단히 요령만 알려드리겠습니다.

테이블 설계시에는 누가 주체 인지를 먼저 생각 하시면 됩니다.

회원 관련 정보는 누가 뭐라고 해도 주체가 되는것은 회원테이블 입니다.

회원 테이블 기준으로 먼저 테이터가 생성 하겠지요?

그런데 클럽테이블에 들어간 정보는 그룹마스터만 정보가 기록 됩니다.

즉 있을 수도 있고 없을 수도 있다 는 의미가 됩니다.

 있을수도 있고 없을수도 있는 정보 조회라면 회원 테이블을 주체로 outer join.

클럽마스터만 조회라면 회원 테이블 주체로 where 조건 걸고 outer join 혹은 클럽테이블을 주체로 inner join.

어떤식으로 묶냐에 따라서 보는 관점이 약간 달라집니다.


총나이와 인원 수는 회원 테이블에서 sum() 함수로 구해올수 있으니 별도로 기록 하실 필요는 없습니다.

join에 대해서 한번 찾아보시면 어느정도 의문점이 해결 되실 것입니다.

그리고 설계된 테이블의 퍼포먼스는 일단 만들어 보시고 조회 쿼리가 explan 으로 가능하면 0.01초 밑으로 나오시는게 좋습니다.
 
변종원(웅파) / 2014/12/26 02:05:22 / 추천 0
상황에 따라 중간 매칭테이블을 쓰기도 합니다.

테이블 : 회원 - 매칭테이블 - 그룹 
      회원번호1   -   1 : 5     - 그룹번호5

회원 테이블이나 그룹의 정보가 필요 없는 경우 빠르게 쿼리를 날리기 위해, 또는
1:N의 관계를 표현하기 위해 사용합니다.

rdbms를 사용하는 이상 관계를 잘 정의하고 효율적으로 사용해야겠죠. 
들국화 / 2014/12/26 09:33:19 / 추천 0
길어서 대략 읽으니 정규화의 문제 같네요.
회원 테이블에 그룹정보를 넣으면 오히려 더 문제가 될수 있습니다.
테이블이 늘어난다고 무조건 속도가 느려지는건 아닙니다.
쿠사 / 2014/12/26 19:32:25 / 추천 0
kaido, 변종원(웅파), 들국화 // 답변들 감사합니다. 일단 join에 대해서 공부를 좀 해봐야겠습니다. 그리고 매칭테이블은 생각을 못했었는데 생각해보니 회원테이블에 그룹정보를 넣지 않는게 좀더 합리적일것같네요. 감사합니다~