제품 테이블과 OrderItem 테이블에 가격을 저장하는 것은 시간이 지남에 따라 가격이 변경 될 수있는 경우 비정규 화하지 않습니다. 정규화 규칙에 따르면 모든 "사실"은 데이터베이스에 한 번만 기록되어야합니다. 그러나이 경우 두 숫자가 모두 "가격"이라고 불리기 만하면 그 숫자가 똑같은 것은 아닙니다. 하나는 현재 가격이고 다른 하나는 판매 날짜 기준 가격입니다. 이들은 매우 다른 것들입니다."고객 우편 번호"와 "우편 번호 저장"이 완전히 다른 분야입니다. 두 가지가 모두 "우편 번호"로 불릴 수도 있다는 사실이 이들을 똑같이 만들지는 못합니다. 개인적으로, 나는 다른 데이터를 보유하는 필드에 혼란을 야기하기 때문에 같은 이름을주는 것에 강한 반대를한다. 나는 그들 모두를 "가격"이라고 부르지 않을 것입니다. 저는 하나를 "Current_Price"라고하고 다른 하나는 "Sale_Price"라고 부를 것입니다.
판매 시점의 가격을 유지하는 것은 분명히 잘못되었습니다. 우리가 그것을 알아야한다면 - 우리가 거의 확실하게 - 그것을 구원해야합니다.
매매마다 또는 가격이 변경 될 때마다 전체 제품 레코드를 복제하는 것도 잘못되었습니다. 가격이 바뀔 때마다 변경되지 않는 설명이나 공급자와 같은 제품에 대한 일정한 데이터가 거의 확실하게 있습니다. 제품 레코드를 복제하면이 모든 데이터를 복제하게됩니다. 이는 분명 비정규 화입니다. 이로 인해 많은 잠재적 문제가 발생합니다. 마찬가지로 누군가가 제품 설명에 철자 오류를 수정 한 경우 "4- 슬라이스 토스터"라고 말하는 이전 기록에 "4- 슬라이스 토스터"라는 새로운 기록이 생길 수 있습니다. 설명을 작성하고 보고서를 정렬하면 분리되어 다른 제품처럼 보입니다. 기타
제품에 관한 변경 사항과 관심있는 데이터 만 가격 인 경우 가격을 OrderItem 레코드에 게시합니다.
변경되는 데이터가 많이있는 경우 Product 테이블을 상수이거나 관심이없는 데이터와 추적해야하는 데이터에 대한 두 테이블로 나누고 싶습니다. 역사. 마찬가지로 설명, 공급 업체, 재고 번호, 배송 중량 등이 포함 된 ProductBase 테이블이 있어야합니다. 가격, 판매 가격 및 일상적으로 변경되는 사항이있는 ProductMutable 테이블이 있습니다. 또한 현재 날짜 또는 적어도 현재 날짜가 표시되어야합니다. ProductMutable의 기본 키는 Product_id와 As_of_date가 될 수 있습니다. 또는 모든 테이블에 대해 간단한 순차 키를 사용하려는 경우 product_id에 대한 참조가 있어야합니다. OrderItem 테이블은 ProductBase가 아닌 ProductMutable을 참조합니다. ProductMutable을 통해 ProductBase를 찾습니다.
출처
2009-08-24 16:57:53
Jay