안녕하세요. 테이블을 설계하고 있는데 궁금한게 있어서 질문드립니다.
현재 시스템은 다음의 요구사항에 맞게 설계를 해둔 상태 입니다.
"하나의 시공 업체는 하나의 건설자재업체와 계약을 맺고 주문을 한다."
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 => 주문의 대상 업체 타입 (시공 혹은 건설)
이런식으로 건설 <-> 건설, 시공 <-> 시공, 시공 <-> 건설의 주문을 받을 수 있게 주문 테이블을 변경하였습니다.
정말 좋은 아이디어라고 생각했는데, 과연 이런식으로 테이블을 설계해도 되는지 의문이 생기더라고요.
이렇게 테이블을 설계해도 될까요?
요구사항 변경전 주문의 경우 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를 나타내고 있는지 나타내려고 했습니다.