동일한 테이블에 두 가지 유형의 조인이 필요합니다 (ADDRESS
및 USER
). 나는 두 테이블 모두 3 열 (ID
, USER_ID
, ADDRESS_ID
)가 (BILLING_ADDRESS
및 SHIPPING_ADDRESS
)를 만들 수 있습니다, 또는 나는 유형 열 (ID
, USER_ID
, ADDRESS_ID
, ADDRESS_TYPE
)와 단일 테이블 (CUSTOMER_ADDRESS
)를 만들 수 있습니다.두 개의 동일한 테이블이 있어야합니까?
DRY 코딩 실습을 위해 나는 단 하나의 테이블만을 생각하고 있지만, 2 개의리스트를 컴파일 할 때 전체 테이블 스캔을 두 번해야한다는 것을 의미합니다.
select address.* from customer_addresses, address where user_id = 1 and address_type = 'Shipping'
두
select address.* from customer_addresses, address where user_id = 1 and address_type = 'Billing'
및
는 customer_addresses 테이블의 전체 테이블 스캔에 의존하고 있습니다.1000 개의 고객 주소가 있으면 해당 고객의 모든 주소를 찾기 위해 2000 개의 레코드가 스캔되었음을 의미합니다.
shipping_addresses 테이블은 800 주소/고객 기록을 보유하고 있기 때문에, 그때 1000 고객 주소를 스캔하는 2 개 개의 다른 테이블을 수행하고 billing_addresses 테이블 성능 그래서 다른 200
을 누르고 있으면 나는 것 2 개의 다른 테이블을 말해야한다. 드라이의 경우 단일 표와 함께 가야합니다. 이것에 대한 업계의 생각은 무엇입니까?
2n에서 1n 사이의 시간 복잡성에 대해 토론하고 있습니다. 이 경우에는 거의 중요하지 않습니다. –
전체 테이블 스캔이 필요하지 않습니다. 'user_id'에 대한 인덱스는 그것을 단지 2 행으로 필터링 할 것이고, 올바른'address_type'을 가진 것을 찾으려면 그 2 행을 스캔해야합니다. – Barmar