안녕하세요. 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 가져올수는 있지만, 혹시 앞서 말한 두 항목 말고 담당자 확인일이러단가, 기타등등 항목이 추가되는 내용이 있을시 피곤해질것 같습니다.)
최종질문) 이런 상황일때 어떻게 설계하면 좋을지 도움 부탁 드립니다.
우선 답변 주셔서 너무 감사합니다. 조금 더 설명을 드리자면
특정 화면에서 특정 액션으로 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건이 됩니다.
질문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
실제로 테스트 한 쿼리가 아니라서 에러의 가능성은 있습니다만 대략 이런 식의 쿼리가 될듯 합니다.