2009-11-18 3 views
1

나는 종종 고객 주문을 찍을 때 스냅 샷을 찍기 위해 다른 테이블의 하나 이상의 필드를 복사하는 주문이나 인보이스에 대해 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) 

답변

5

내가 작업 한 온라인 영업 응용 프로그램에서 우리는 계산 된 세금과 가격을 항상 배치 될 때 각 개별 주문에 복사했습니다. 이것은 "스냅 샷"옵션입니다. 우리는 결코 그것을 다시 계산하지 않았다. 왜?

  • 가격이 변경됩니다. 스냅 샷은 제품이 주문되었을 당시의 가격을 캡처 한 것이지 현재의 가격이 아닙니다.
  • 테이블이 변경됩니다. 당신은 당신의 가격에 대한 모든 생산자와 소비자를 의지하여 그 견해에 대해 알고 그 견해만을 사용합니다. 영원히. 스냅 샷을 제공하면 미래의 데이터 소비자는 계산 방법에 신경을 쓰지 않습니다.
  • 스키마가 변경됩니다. 온타리오 주에서는 판매 세가 계산되는 방식과 세금이 부과되는 제품을 변경하고 있습니다. 이렇게하면보기가 중단되지만 스냅 샷은 중단되지 않습니다.
  • 규칙이 변경됩니다. 우리는 고객이 쿠폰 및 가격 매칭과 같은 것에 대한 규칙을 무시할 수있는 방법을 제공해야했습니다. snapshotted 가격을 재정 의하여이 작업을 수행 할 수 있습니다.보기를 사용하여 수행 할 수 없습니다.
+0

가격 및 세금은 스키마에서 별도의 엔터티이며 주어진 시간에 값을 조회하는 시작/종료 날짜가 있으므로 문제가되지 않습니다. 그러나 스냅 샷을 사용하면 미래의 데이터 소비자에게 데이터가보다 투명하게 전달됩니다. 그리고 더 나은 점 : 나의 할인 규칙은 두통입니다. 내 접근 방식을 사용하면 변경된 경우 이전 규칙을 저장해야합니다! 그 점을 지적 해 주셔서 감사합니다! – Tony

+0

필자는 예를 들어 세금이 달라지는 것이 아니라 세금 계산 방법이 변경된다는 것을 분명히하기 위해 편집을 시도했다. 다른 데이터베이스 스키마가 필요합니다. –

1

보통 스냅 샷은 쉽게 당신이 각 판매의 충실한 기록을 확보 할 수 있도록 복용하거나 고객 불만 처리. 스냅 샷을 사용하면 단일 테이블을 안전하게 유지하고 엄격한 감사를 통해 문제를 해결할 수 있습니다.

귀하의 방식대로하면 보증 번호가 이됩니다.은 주로 관련 테이블 (할인, 세금, 제품, 주문 등)을 사용하는 사람이 아무도 없는지 확인해야하기 때문에 훨씬 어려워졌습니다. 예를 들어, 누군가가 2005 년 1 월 할인율을 변경했는지 어떻게 알 수 있습니까? 또한 데이터 모델을 손쉽게 진화시킬 수 없으므로 할인율에 대해 둘 이상의 열이 있어야하는 경우 미래의 계산을 변경해야 할뿐만 아니라 기존의 열을 유지해야합니다 과거를 위해 (또는 다른 방법으로 모든 호환 작업을 수행 할 수 있습니다.)

공간이 저렴하고 스냅 샷을 사용하면 많은 비용을 들이지 않고 훨씬 쉽습니다.

관련 문제