나는 실행하려는 가능성이 높은 쿼리를보고 그 기준으로 모델을 설계하는 것이 좋습니다.
예를 들어, "고객이 주문한 주문이 무엇입니까?"를 알고 싶습니다. 가장 자연스러운 표현 방식은 다음과 같습니다.
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에 거주하는 고객을위한 주문"이라는 쿼리는 고통 스럽습니다.
이 문제는 가장 수준 높은 것으로 보인다. 고맙습니다! 부가 메모에서 첫 번째 코드 블록의 마지막 행에 공백이 누락되었지만 6 자 이상 편집하지 않아도 편집을 제안 할 수는 없습니다. – Jakob