2009-12-30 4 views
0

나는 책을 읽고 있는데, 여기서 저자는 한 행에 행 + 모든 연결된 부모 행을 가져 오는 것에 대해 이야기합니다. 주문을 가져 오는 것과 모든 항목을 한꺼번에 가져 오는 것과 같습니다. 좋아요, 근사하지만 실제로는 SQL에 대해 묻는 질문은 한 번도 없었습니다. 이 레코드 세트는 어떻게 생겼습니까? 하나의 행에 항목 필드에 많은 NULL 값이있는 반면, 100 행에 순서 필드에 대한 많은 NULL 값이있는 항목과 주문 테이블의 병합 된 필드가있는 101 개의 행을 얻을 수 있습니까? 그게 갈 길이야? 아니면 뭔가 더 시원합니까? 내 말은 ... 필드에 배열을 가져 오는 것에 대해 들어 본 적이 없다는 말입니까?개체 그래프를 한 번에 가져 오는 방법은 무엇입니까?

답변

3

간단한 트릭을 할 것 가입 :

SELECT  o.* 
,   i.* 
FROM  orders o 
INNER JOIN order_items i 
ON   o.id = i.order_id 

(가) order_items의 각 행에 대해 한 행을 반환합니다. 반환 된 행은 orders 테이블의 모든 필드로 구성되며 order_items 테이블의 모든 필드에 연결됩니다 (문자 그대로 테이블의 레코드가 조인됩니다. 즉, 레코드 연결로 결합됩니다).

So 주문이 (id, order_date, customer_id)이고 order_items가 (order_id, product_id, price) 인 경우 위의 문의 결과는 (ID, 주문 _ 날짜, 고객 _ ID, 주문 _ ID, 제품 _ ID, 이 접근 방식은 하나의 '마스터'에 대해 두 개의 서로 다른 '세부 사항'테이블이있을 때마다 중단된다는 점을 알아야합니다. 설명하겠습니다.

orders/order_items 예에서 orders는 마스터이고 order_items는 세부 사항입니다. order_items의 각 행은 orders의 정확히 하나의 행에 속하거나 종속되어 있습니다. 그 반대는 사실이 아닙니다. orders 테이블의 한 행은 order_items 테이블에서 0 개 이상의 관련 행을 가질 수 있습니다. 조건에 가입

ON o.id = i.order_id 

에만 관련 행이

(당신이 조건에 가입 생략 할 수 있도록 할 데이터베이스를 가정, 두 개의 테이블에서 행의 가능한 모든 조합을 retturn 할 조건을 떠나) 결합 및 반환 보장

이제 두 개의 세부 정보가있는 마스터가 하나 있다고 가정합니다 (예 : customers는 master, customer_orders는 detail1 및 customer_phone_numbers). 모든 주문과 모든 전화 번호와 함께 특정 고객을 검색하려고한다고 가정합니다. 당신이 작성하는 유혹 될 수 있습니다 이것은 유효한 SQL이며, 그것을 실행합니다

SELECT  c.*, o.*, p.* 
FROM  customers    c 
INNER JOIN customer_orders   o 
ON   c.id     = o.customer_id 
INNER JOIN customer_phone_numbers p 
ON   c.id     = p.customer_id 

(테이블을 asuming 및 열 이름은 장소에) 그러나 문제는, 당신에게 쓰레기 결과를 줄 것입니다. 이 순서 1과 전화 사이에 어떤 관계가 암시 하듯이

customer-data | order 1 | phone A 
customer-data | order 2 | phone A 
customer-data | order 1 | phone B 
customer-data | order 2 | phone B 

이 쓰레기가있다 : 당신이 개 주문 (1,2) 및 두 개의 전화 번호와 고객에 미칠 가정 (A, B) 당신은이 기록을 얻을 숫자 A와 B, 주문 2, 전화 번호 A와 B가 포함됩니다.

이러한 결과는 데이터베이스 성능을 크게 상실하는 많은 수의 레코드에서 완전히 폭발 할 수 있습니다.

그래서 JOIN은 깊이가 알려진 항목의 계층 구조 (customer -> orders -> order_items)를 각 세부 항목의 마스터 항목 만 복제하는 하나의 큰 테이블로 "평평하게"우수합니다. 그러나 관련 항목의 실제 그래프를 추출하는 것은 끔찍합니다. 이는 SQL이 설계된 방식의 직접적인 결과입니다. 반복되는 그룹이 없어도 정규화 된 테이블 만 출력 할 수 있습니다. 이것은 프로그래머로서의 정신을 잃지 않고 여러 종속 오브젝트의 콜렉션을 저장하고 관계형 데이터베이스에서 검색 할 수있는 오브젝트 정의를 허용하기 위해 오브젝트 관계형 맵퍼가 존재하는 방식입니다.

1

이것은 일반적으로 JOIN 절을 통해 수행됩니다. 이렇게하면 많은 NULL 값이 생기지 않지만 상위 행에 대한 많은 반복 값이 생깁니다.

데이터베이스 및 프로그래밍 언어에서 지원하는 경우 다른 연결 옵션으로 두 결과 집합을 모두 반환 할 수 있습니다. 하나는 관련 행에 대해 다른 행을 선택합니다.

관련 문제