설계가 잘못된 부분이나, 더 좋은 방향이 있다면 도움 부탁 드립니다. 0 4 1,700

by 모던 [MySQL] [2023.11.07 17:10:25]


20231107_170646.png (40,987Bytes)

안녕하세요. DB는 mariadb 10.4 사용중입니다.

 

발주서를 작성하면 order 테이블과 order_product 테이블에 데이터가 누적되고,

몇일 뒤에 해당 발주서를 업체별로 그룹핑하여 별도 화면에 노출합니다. (그림에 "view 화면" 참고)

 

- order 와 order_product 테이블의 데이터는 삭제할 수 없습니다.

- 일별 데이터 누적량은 대략 order 는 50건 미만, order_product 는 짐작할수 없지만 하나의 발주당 10개이상의 제품이 들어가지 않을 확률이 높기에 대략 500건 미만


 

질문1) order_group.partner_id, order_group.currency 컬럼을 유지해야하는지 의문입니다.

(삭제 해야한다면 "보여지는 화면" 텍스트 아래의 GRID 처럼 구성하려면 쿼리를 어떻게 해야될까요?)

(유지해야한다면 partner_id, currency 변경시마다 order 및 order_group 두 테이블 모두 수정 해야합니다. 혹시 포린키가 이 부분을 해결해 줄수 있을까요?)

 

질문2) order_group 테이블을 만들지 말고 order 테이블에 계약금지불일, 잔금완료일을 중복으로 추가하는게 맞을까요? (조회시엔 group by 가져올수는 있지만, 혹시 앞서 말한 두 항목 말고 담당자 확인일이러단가, 기타등등 항목이 추가되는 내용이 있을시 피곤해질것 같습니다.)

 

최종질문) 이런 상황일때 어떻게 설계하면 좋을지 도움 부탁 드립니다.

by 우주민 [2023.11.07 17:38:51]

질문에 앞서 아래 내용들이 궁금합니다.

 

1. 계약금지불일, 잔금완료일 은 별도로 관리해야 하는건가요?

(만약 ORDER 테이블에서 관리하게 된다면 어떤 식으로 관리되나요?)

2. ORDER 테이블의 ORDER_GROUP_ID 컬럼의 값이 동일할 경우 PARTNER_ID , CURRENCY 컬럼의 값이 단일 값을 가지나요?

3. 발주건수는 ORDER 테이블의 ORDER_GROUP_ID 를 기준으로 취합하나요? 아니면 ORDER 테이블 전체를 기준으로 취합하나요?

 

해당 데이터의 구조를 정확히 이해 못해 재 질문 드려봅니다.


by 모던 [2023.11.08 09:23:19]

우선 답변 주셔서 너무 감사합니다. 조금 더 설명을 드리자면

특정 화면에서 특정 액션으로 ORDER 테이블과 ORDER_PRODUCT 테이블의 데이터가 INSERT 되고, ORDER 데이터를 PARTNER_ID 와 CURRENCY 기준으로 그룹화 합니다.

이 그룹화 과정에서 ORDER_GROUP 테이블에 하나의 ROW 가 INSERT 되고, 새로 INSERT 된 ORDER_GROUP.ID 값을 ORDER 테이블의 ORDER_GROUP_ID 컬럼에 UPDATE 합니다.

사용자는 ORDER_GROUP 데이터에 계약금지불일, 잔금완료일등과 같은 정보를 입력하고, 해당 내용을 ORDER_GROUP 에 UPDATE 합니다.

 

1. 계약금지불일, 잔금완료일 은 별도로 관리해야 하는건가요?

(만약 ORDER 테이블에서 관리하게 된다면 어떤 식으로 관리되나요?)

 

===> 네 별도로 관리해야 합니다. 예시로 두 컬럼을 별도 저장한다고 말씀드리긴 했지만, ORDER_GROUP 에서 별도로 관리해야하는 데이터는 조금 더 많을 수 있습니다.

 

2. ORDER 테이블의 ORDER_GROUP_ID 컬럼의 값이 동일할 경우 PARTNER_ID , CURRENCY 컬럼의 값이 단일 값을 가지나요?

 

===> ORDER_GROUP_ID 컬럼의 값이 동일한 경우 PARTNER_ID, CURRENCY 컬럼의 값은 동일합니다.

 

3. 발주건수는 ORDER 테이블의 ORDER_GROUP_ID 를 기준으로 취합하나요? 아니면 ORDER 테이블 전체를 기준으로 취합하나요?

 

===> ORDER_GROUP_ID 기준으로 취합됩니다. 첨부된 이미지 파일 기준으로는 ORDER_GROUP_ID 가 3건이므로 발주건수는 3건이 됩니다.


by 우주민 [2023.11.08 13:23:32]

질문1) order_group.partner_id, order_group.currency 컬럼을 유지해야하는지 의문입니다.

-> ORDER 테이블의 PARTNER_ID , CURRENCY를 이용하면 ORDER_GROUP 에서 굳이 쓸 필요는 없어 보입니다.

 

질문2) order_group 테이블을 만들지 말고 order 테이블에 계약금지불일, 잔금완료일을 중복으로 추가하는게 맞을까요?

-> 기존에 테이블의 구조를 바꾸지 못한다면 새로운 테이블로 관리하는것이 더 나아 보입니다.

 

SELECT 
  ROWNUM AS NO
, MAX(OD.CURRENCY) AS CURRENCY
, MAX(PN.업체명) AS 업체명
, MAX(OD.SEND_DATE) AS 마지막발주일
, COUNT(1) AS 발주건수
, MAX(OG.DATA1) AS 계약금지급일
, MAX(OG.DATA2) AS 잔금완료일
FROM ORDER OD
, ORDER_GROUP OG
, PARTNER PN
WHERE OD.ORDER_GROUP_ID = OG.ORDER_GROUP_ID
AND OD.PARTNER_ID = PN.ID
GROUP BY OD.ORDER_GROUP_ID

실제로 테스트 한 쿼리가 아니라서 에러의 가능성은 있습니다만 대략 이런 식의 쿼리가 될듯 합니다.

 


by 모던 [2023.11.08 15:32:52]

우주민님 답변 감사드립니다.

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