나는 종종 고객 주문을 찍을 때 스냅 샷을 찍기 위해 다른 테이블의 하나 이상의 필드를 복사하는 주문이나 인보이스에 대해 line_item 테이블을 보았습니다.모든 경우에 대해 광고 항목 가격의 데이터 스냅 샷이 계산보다 낫습니까?
그러나 내 스키마에서는 데이터를 복사하지 않고 주문 뷰를 생성 할 수 있습니다. 따라서 주문/제품/가격 데이터를 조회하는 것은 다소 비용이 많이 들지만 복사/삽입시 시간, 공간 및 중복성은 절약됩니다. 룩업이 여러 번 요구되는 반면 사본/삽입은 일회성 거래라는 것을 이해합니다. 그러나 특정 테이블에서 수십만 개의 레코드 만 처리하고 성능은 기대하지 않습니다. 이슈.
a) 내 스키마가 스냅 샷이없는 정확한 조회를 지원하고 b) 조회 최적화가 필요하지 않기 때문에 계산을 실행하는 것이 바람직하다고 생각합니다. 스냅 샷을 찍는 대신 아니면 제가 누락 된 것이 있습니까? 그리고 이런 경우 항상 스냅 샷을해야합니까? 여기
는 룩업 계산은 다음과 같은 형태가 될 것이다의 예 : ● 데이터웨어 하우스를 위해 그것을 할,
# display order items for a particular order on a particular date
# get order, products and base prices from order_id
order_products = SELECT * FROM order_has_product ohp
INNER JOIN price ON (price.product_id = ohp.product_id)
INNER JOIN order ON (order.id = ohp.order_id)
WHERE order_id = ?
# calculate price of each product at order.datetime_opened
for op in order_products:
tax = SELECT SUM(tax.rate) FROM product_has_tax pht
INNER JOIN tax ON (tax.id = pht.tax_id)
WHERE pht.product_id = op.product_id
AND tax.date_start <= op.datetime_opened
AND tax.date_end >= op.datetime_opened
discount_product = SELECT SUM(discount.rate) FROM product_has_discount phd
INNER JOIN discount ON (discount.id = phd.discount_id)
WHERE phd.product_id = op.product_id
AND discount.date_start <= op.datetime_opened
AND discount.date_end >= op.datetime_opened
discount_customer = SELECT SUM(discount.rate) FROM customer_has_discount chd
INNER JOIN discount ON (discount.id = chd.discount_id)
WHERE chd.customer_id = op.customer_id
AND discount.date_start <= op.datetime_opened
AND discount.date_end >= op.datetime_opened
AND (chd.date_used_limited IS NULL OR chd.date_used_limited = op.datetime_opened)
discount = discount_product + discount_customer
price = op.price * (1-discount) * (1+tax)
가격 및 세금은 스키마에서 별도의 엔터티이며 주어진 시간에 값을 조회하는 시작/종료 날짜가 있으므로 문제가되지 않습니다. 그러나 스냅 샷을 사용하면 미래의 데이터 소비자에게 데이터가보다 투명하게 전달됩니다. 그리고 더 나은 점 : 나의 할인 규칙은 두통입니다. 내 접근 방식을 사용하면 변경된 경우 이전 규칙을 저장해야합니다! 그 점을 지적 해 주셔서 감사합니다! – Tony
필자는 예를 들어 세금이 달라지는 것이 아니라 세금 계산 방법이 변경된다는 것을 분명히하기 위해 편집을 시도했다. 다른 데이터베이스 스키마가 필요합니다. –