이런 경우는 어떻게 테이블을 설계하는게 더 좋을까요? 0 6 1,114

by momo [DB 모델링/설계] [2023.05.25 14:27:12]


안녕하세요. 테이블을 설계하고 있는데 궁금한게 있어서 질문드립니다.

 

현재 시스템은 다음의 요구사항에 맞게 설계를 해둔 상태 입니다.

"하나의 시공 업체는 하나의 건설자재업체와 계약을 맺고 주문을 한다."

order_id => 주문 번호

contractor_id => 시공 업체

sub_contractor_id => 건설자재업체

order_table 구조

order_id
contractor_id
sub_contractor_id ...
20230525 시공1 건설1  

 

 

그런데 요구사항이 다음과 같이 변경되었습니다.

"하나의 시공 업체는 다른 시공 업체와 주문을 할 수 있고, 하나의 건설자재업체도 다른 건설자재업체와 주문을 할 수 있다."

 

그래서 주문 테이블을 다음과 같이 변경하려고 합니다.

order_id company_id target_company_id company_type target_company_type ...
2023052501 시공1 시공1 시공 시공  
2023052502 시공1 건설1 시공 건설  

 

company_id => 주문 하는 업체의 id

company_type => 주문 하는 업체의 타입 (시공 혹은 건설)

target_company_id => 주문의 대상 업체 id

target_company_type => 주문의 대상 업체 타입 (시공 혹은 건설)

 

이런식으로 건설 <-> 건설, 시공 <-> 시공, 시공 <-> 건설의 주문을 받을 수 있게 주문 테이블을 변경하였습니다.

정말 좋은 아이디어라고 생각했는데, 과연 이런식으로 테이블을 설계해도 되는지 의문이 생기더라고요. 

 

이렇게 테이블을 설계해도 될까요?

 

 

 

 

 

by 마농 [2023.05.25 15:04:29]

company_type 은 company 에 종속되는 것 아닌지요?
그렇다면 company_type 은 order 테이블이 아닌 company 테이블에서 관리해야 할 것 같네요.

기존 요구사항은 어떻게 구현하신 건가요?
order 테이블의 (contractor_id, sub_contractor_id)에 유니크 설정을 하신 것일까요?
추가 요구사항은 기존 제약을 제거하면 저절로 구현되는게 아닐런지?


by momo [2023.05.25 15:42:47]

요구사항 변경전 주문의 경우 contractor는 sub_contractor와만 주문을 하기 때문에  주문 테이블은 contractor테이블과 sub_contractor 테이블과 관계가 맺어져 있었습니다.

그래서 주문 테이블의 contractor_id와 sub_contractor_id는 fk로 설정이 돼있었습니다. (contractor와 sub_contractor 테이블은 이름만 비슷하지 안에 데이터는 다릅니다.) 

order_id contractor_id (fk) sub_contractor_id (fk)
2023052501 example_contractor example_subContractor

 

그런데  요구사항이 변경되면서 더 이상 저 구조를 유지할 수 없게 되었습니다. contractor가 sub_contractor와 주문 할 수도 있고, contractor가 contractor에게 주문 할 수도 있으며    sub_contractor도 sub_contractor에게 주문할 수 있고 contractor에게 주문할 수 있기 때문입니다.

그래서 처음에는 말씀하신것처럼 다음과 같이 기존 제약을 제거하고 컬럼명만 조금 다르게 해서 관리하려고 했었습니다.

order_id company_id target_company_id
2023052501    

 

이렇게 fk를 제거하고 설계하면 company_id에  contractor 테이블의 contractor_id가 와도 되고, sub_contractor 테이블의 sub_contractor_id가 와도 되서 요구사항을 만족할 수 있었습니다. target_company_id도 마찬가지고요.

 

그런데 이렇게 설계하니까, 데이터만 봤을때는 company_id가 contractor 테이블의 id인지 sub_contractor의 id인지 구분이 안가더라고요.

그래서 나온게 아래의 테이블입니다.

order_id company_id target_company_id company_type target_company_type ...
2023052501 시공1 시공1 시공 시공  
2023052502 시공1 건설1 시공 건설  

이렇게 company_type을 만들어서 company_id가 어떤 테이블의 id를 나타내고 있는지 나타내려고 했습니다.

 

 

 

 


by 마농 [2023.05.25 15:56:00]

contractor 와 sub_contractor 를 하나(company)로 합치면서 company_type 추가


by momo [2023.05.25 16:05:31]

그것도 생각해보긴 했는데, 하나의 테이블로 합쳐서 관리하기엔 서로 데이터가 너무 다르더라고요 ㅠㅠ

 


by 마농 [2023.05.25 16:13:59]

company 테이블에서는 기본적인 정보만 관리(company_id, company_nm, company_type 정도)
contractor 와 sub_contractor 에서는 company_id 를 상속받아 세부사항 관리
order 테이블에서는 company 참조


by momo [2023.05.25 16:29:31]

이 방법은 생각 못해봤네요! 

이렇게해서 company_id만 받도록 수정해보겠습니다

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