디비 설계 및 쿼리 질문 드립니다. 0 8 1,490

by 박시우 [DB 기타] 논리적구조 [2014.06.05 14:20:51]


데이터 베시스 설계 질문 드립니다.

> 업무전달 디비 설계 (하나의 사용자는 여러명에게 업무를 전달할 수 있다)

-----------------------------------------------

> TABLE A --> 보낸 업무

seq  시퀀스

id   발송자 아이디

subject 제목

content 내용

createdt 발송일

------------------------------------

> TABLE B --> 받은 업무

seq  시퀀스

id    받는사용자 아이디

readDt 읽은 일자(날짜가 널이 아니면 읽은것이 되겠죠)

aseq (A 테이블의 FK)

-----------------------------------------

문제는 받은 업무를 조회시 입니다.

일반적으로 받은 업무 조회시 일자를 기반으로 검색합니다.

즉 내가 1일 부터 20일까지 받은 업무를 조회시

 

A 테이블의 발송일이 1~20 사이 데이터를 추출합니다.

그리고 A 테이블의 seq 를 추출하여 B 테이블의 aseq 와 같은 놈들만

다시 가져 오고 그리고 그중에서 B 테이블의 나의 아이디를 다시 추출하여야 내가

받은 업무 가 되는 것이죠..

이렇게 하면 되긴하는데 예를 들어 1 ~ 20 일까지 내가 반은 업무가 하나도

없을경우에도 A 테이블의 기간내 모두 조회하고 그걸 다시 B 테이블과 조인하고

뭔가 비효율적이라는 거죠. 어덯게 설계하는것이 바랍직할지 조언 드립니다.

 

 

 

 

by 마농 [2014.06.05 14:37:14]

조건은 두가지 입니다.
일자조건과 ID조건.
일자조건을 먼저 따지는 순서(A==>B)만 생각하셨네요.
ID조건을 먼저 따지는 방법(B==>A)도 있습니다.
어떤 순서로 조회하던 간에
하나는 인덱스 조건이 되지만, 나머지 하나는 필터조건이 됩니다.
자주 사용할 조건이라면 B 에 A의 생성일을 받아 가지고 있는 것이 좋겠네요.
(성능을 고려한 반정규화)


by 박시우 [2014.06.05 14:47:59]

네 마농님 저도 해당 업무의 데이터가 너무 방대하여 성능을 고려하여

B 테이블쪽에 일자를 넣어 놓았습니다. 그런데 어덯게 보면 데이터의 중복이

발생하는것이라 이렇게 하는것이 DB설계에서 맞는지가 약간 의문입니다.

조언주신대로 B-> A로 조회시에도 역시 불필요한 기간을 검색하게 되니

때문에 .. B-> A 또한 역시 ...


by 박시우 [2014.06.05 14:53:51]

반정규화 말은 들어봤지만 이럴때 이렇게 쓰는지 잘몰랐네요.

감사합니다.


by 창조의날개 [2014.06.05 15:29:29]

SELECT *

FROM A

WHERE SEQ IN (

            SELECT ASEQ

            FROM B

            WHERE ID ='ID'

            AND (( READDT >= 1 AND READDT <= 20) OR READDT IS NULL)

)

AND CREATEDT  >= 1 AND CREATEDT <= 20

이정도는 어떨지?

PS : 

ID와 READDT 날자 부분은 알아서 잘 쓰세요 ^^

마농님 의견에 따라 CREATEDT 조건하나 더 넣었어요

 


by 마농 [2014.06.05 16:28:19]

날짜조건은 readDt 가 아닌 createdt 에 거는 거죠.


by 백면서생 [2014.06.05 15:51:41]

위의 내용을 봐서는  테이블이 분리될 이유가 없어 보이네요.

성격상 M:M관계를 엔터티로 만든 교차 엔터티 정도로 떨어뜨리면 될거 같은데요.

seq | snd_id | rcv_id | subject | content | creDt | readDt | 시스템속성컬럼~

 이 테이블에 적절한 결합 인덱스를 붙히면 크게 문제 없어 보이네요.

분리하시게 되면 걱정하시는 것 처럼 반정규화를 해야 하는 문제가 생기니까요.

설계 전이시라면 통합하시는게 바람직하리라 생각됩니다.

 

 


by 마농 [2014.06.05 16:26:39]

보내는이와 받는이가 1:M 이므로
분리하는 것이 바람직해 보이네요.
하나로 통합시 title, content 등의 중복자료가 발생됩니다.


by 백면서생 [2014.06.05 17:28:27]

글을 쓰고 보니 마농님 말씀 처럼 여러명에게 보낼 경우는 제목과 내용이 중복되겠군요.

보낸업무 받은 업무/ 발송자 아이디 수신자 아이디 라는 것만 보고  성급한 답변을 드렸네요.^^

테이블이 분리가 된다면 보통 물리설계시 시스템 컬럼(Tech Item)인

credate(최초생성일시), creuser(최초생성자),upddate(최종변경일시),upduser(최종변경자) 등이

들어가므로 테이블B의 credate 컬럼을 수신일 개념으로 사용할 수 있겠네요.

 

 

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