2017-11-13 5 views
0

웹샵에는 UserSnapshotPurchase의 두 가지 테이블이 있습니다. 구매시, 사용자의 현재 정보는 스냅 샷이므로 나중에 사용자가 제거되거나 변경된 경우에도 구매 기록이 손상되지 않습니다. 이렇게하면 1 : 1 관계가 생깁니다. 각 구매에는 하나의 사용자 스냅 샷 만 있고 각 사용자 스냅 샷에는 하나의 구매 만 있습니다.1 : 1 관계를 구현하기위한 이상적인 사례

내 질문은 어떻게 구현해야합니까? 구매 테이블에서 사용자 스냅 샷을 가리키는 외래 키를 사용해야합니까, 아니면 다른 방식으로 사용해야합니까? 아니면 둘 다 사용해야합니까 (중복)? 두 가지를 결합해야합니까 (지저분한)? 사용자 스냅 샷을 직렬화합니다 ('필드 당 하나의 값'을 따르지 않음)?

답변

1

나는 실행하려는 가능성이 높은 쿼리를보고 그 기준으로 모델을 설계하는 것이 좋습니다.

예를 들어, "고객이 주문한 주문이 무엇입니까?"를 알고 싶습니다. 가장 자연스러운 표현 방식은 다음과 같습니다.

select * 
from customer c 
inner join customer_snapshot cs 
    on c.customer_id = cs.customer_id 
inner join orders o 
    on cs.order_id = o.order_id 

여기서 c.customer_id =?

또는 "이 주문한 고객의 현재 상태는 무엇입니까?"

select * 
from order o 
inner join customer_snapshot cs 
    on o.order_id = cs.order_id 
inner join customer c 
    on cs.customer_id = c.customer_id 
where o.order_id = ? 

customer_snapshot 테이블을 "many to many"조인 테이블로 거의 사용하므로 자연 스럽습니다.

하지만 그 대부분은 문체가 있습니다.이 연결은 쉽게 o.customer_snapshot_id = cs.customer_snapshot_id 일 수 있습니다.

"도시 x에 거주하는 고객에게 얼마나 많은 주문을 보냈습니까?"

select * 
from order o 
inner join customer_snapshot cs 
    on o.order_id = cs.order_id 
inner join customer c 
    on cs.customer_id = c.customer_id 
and cs.city = ? 

"중복"열이 필요하지 않습니다. 모든 쿼리는 농구대를 뛰어 넘지 않고 작동합니다. 스냅 샷 데이터를 직렬화 할 수 있지만 "도시 x에 거주하는 고객을위한 주문"이라는 쿼리는 고통 스럽습니다.

+0

이 문제는 가장 수준 높은 것으로 보인다. 고맙습니다! 부가 메모에서 첫 번째 코드 블록의 마지막 행에 공백이 누락되었지만 6 자 이상 편집하지 않아도 편집을 제안 할 수는 없습니다. – Jakob