2013-10-10 1 views
3

가설, 나는 제품과 여러 테이블에서 주문 정보 (주문, order_items, 제품)유지하기 위해 데이터의 무결성

orders 
    id    INT(11) 
    shipping_name VARCHAR(255) 
    shipping_street VARCHAR(255) 
    shipping_city VARCHAR(255) 
    [etc] 

order_details 
    id    INT(11) 
    order_id  INT(11) 
    product_id  INT(11) 

products 
    id    INT(11) 
    name   VARCHAR(255) 
    description  VARCHAR(255) 
    price   DECIMAL(8,2) 

구조는 order 여러가 있습니다 매우 간단 추적하는 시스템 인 경우 order_items, order_items은 하나가 product입니다.

누군가가 제품을 편집 할 때 이러한 편집은 이전 주문의 데이터를 수정한다는 점에서 문제가 있습니다. 직원이 나중에 돌아가서 해당 정보를 나중에보아야하는 경우 주문이 접수 된 시점에 고객이받은 것과 동일한 정보가 제공되지 않을 수 있습니다.

모범 사례는 무엇입니까? 'display_item'필드를 products 테이블에 추가하고 edit/delete 세트 표시를 0으로 설정하고 편집 된 제품을 새 행으로 추가해야합니까? 이름, 설명 및 가격을 order_details에 복제해야합니까?

+0

[이 게시물을보십시오 (http://stackoverflow.com/a/11930467/533120). –

답변

0

데이터베이스 정규화가 "중단되는"경우 중 하나라고 생각합니다.

몇 가지 가능한 솔루션 :

  1. 제품의 사본을 보관은 각 주문에 대한 속성.
    이것은 저장 비용면에서 비싸지 만 주문에 저장된 제품 데이터를 쉽게 추적 할 수 있습니다.
  2. 시간에 변경할 수있는 특성의 로그를 만듭니다. 제품 속성은 시간이 지남에 따라 변경 될 수 있으므로 수정 날짜를 저장하는 로그는 주문이 만들어진 순간까지 제품 속성을 필터링하는 데 도움이 될 수 있습니다. 옵션 1

    위한

제안은 products 테이블의 복사본을 생성하고, 각 순서 위해서 세부에 대한 order_details 테이블의 관계를 (일대일) 생성. 옵션

제안이

분할이있는 products 테이블 : product_general_infoproduct_attributes. 제품 일반 정보는이 표의 데이터 수정 사항이 전체 주문 집합으로 전파되므로 시간 경과에 따라 안정적으로 유지됩니다 (제품의 일반 정보는 변경되지 않음). 특성이 변경된시기를 정의하려면 제품 속성에 date 또는 timestamp 값이 있어야합니다. 그런 다음 데이터베이스를 u 리하고 주. 날짜 전 또는 그 이전의 마지막 레코드를 리턴 할 수 있습니다.

관련 문제