2015-02-07 4 views
0

동일한 테이블에 두 가지 유형의 조인이 필요합니다 (ADDRESSUSER). 나는 두 테이블 모두 3 열 (ID, USER_ID, ADDRESS_ID)가 (BILLING_ADDRESSSHIPPING_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 개의 다른 테이블을 말해야한다. 드라이의 경우 단일 표와 함께 가야합니다. 이것에 대한 업계의 생각은 무엇입니까?

+0

2n에서 1n 사이의 시간 복잡성에 대해 토론하고 있습니다. 이 경우에는 거의 중요하지 않습니다. –

+1

전체 테이블 스캔이 필요하지 않습니다. 'user_id'에 대한 인덱스는 그것을 단지 2 행으로 필터링 할 것이고, 올바른'address_type'을 가진 것을 찾으려면 그 2 행을 스캔해야합니다. – Barmar

답변

2

배송 주소와 청구서 수신 주소가 다른 것일 수 있습니다. 예를 들어, 청구서 수신 주소는 사서함 일 수 있지만 배송 주소는 자주 사용할 수 없습니다. 마찬가지로 배송 주소에는 연락처 이름, 연락처 전화 번호 및 배송 중지 지침과 같은 기타 정보가 포함될 수 있습니다. 차이점이 개별 엔티티를 만들 정도로 충분히 중요한지 또는 주소 테이블에 몇 개의 개별 필드가 있는지를 결정해야하기 때문에이를 언급합니다.

다른 필드가 있음을 알려 드리기위한 것입니다.

나는이 (고정 join 구문) 당신이 제안 쿼리 생각 :

select a.* 
from customer_addresses ca join 
    address a 
    on ca.address_id = a.address_id 
where ca.user_id = 1 and ca.address_type = 'Billing'; 

이 전체 테이블 지능형 데이터 설계와 검사가 필요하지 않습니다. Barmar가 의견에서 지적한 것처럼이 테이블에 적절한 인덱스가 있어야합니다. 이 경우 원하는 인덱스는 customer_address(user_id, address_type)address(address_id)입니다. 데이터베이스가 SELECT 쿼리에 대해서만 전체 테이블 스캔을 수행하면 SQL은 훨씬 덜 유용한 언어가되어 아마도 아무데도 사용되지 않을 것입니다.

+0

별도의 테이블에 두었을 때의 유연성이 지적하여 다른 테이블에 넣을 수 있도록 설득했습니다. –

0

하나의 테이블로 유연성을 높일 수 있습니다. 예를 들어, 장래에 고객이 대체 운송 주소를 저장할 수있게하고 주문할 때 하나를 선택할 수 있습니다. address_type = 'Alternate Shipping Address'을 추가하면 다른 전체 테이블을 추가 할 필요가 없습니다.

이 디자인의 성능에 미치는 영향은 거의 없습니다. user_id의 색인은 검색어를 원하는 주소 유형으로 검색해야하는 몇 줄로 좁 힙니다.

0

이 하나의 테이블은 모든 사용자의 요구 사항을 충족하는 경우 훨씬 더,이 경우에 당신이 언급 양쪽 시나리오 redundant data는 당신이이 경우에 내가 생각하기에, 더 많은 정보를 위해 normalization을 볼 수있을 것이다 하나의 테이블 ADDRESS (ID, USER_ID, SHIPPING_ADDRESS_ID, BILLING_ADDRESS_ID).보다 훨씬 인 Netter입니다 주소에 견인 테이블이 있어야 도달 할 수 없습니다. forth normal form