2009-08-23 6 views
2

. NET에서 꽤 표준적인 온라인 상점을 만들면서, 나는 내 데이터베이스에 관한 약간의 건축 수수께끼를 실행했다. 테이블 "OrderItems"에 의해 참조되는 테이블 "Orders"가 있습니다. 후자는 "제품"표를 참조합니다.
이제 orders와 orderitems 테이블은 대부분 변경되지 않습니다. 즉, 생성 된 주문과 해당 orderitem은 테이블을 볼 때 상관없이 동일하게 보일 것입니다 (예 : 부기 주문 영수증 인쇄 주문할 때마다 고객이받은 영수증을 매년 내야합니다.)
이 동작을 달성하는 두 가지 방법을 생각해 볼 수 있습니다. 그 중 하나는 현재 사용 중입니다.
1. 제품의 가격과 같은 값이 주문 항목 테이블에 복사되는 역 정규화.
2. 참조 된 테이블을 변경 불가능하게 만들기. 제품을 다루는 코드는 가격과 같은 값이 변경 될 때마다 새로운 제품을 만들 수 있습니다. 제품을 참조하는 변경 테이블은 참조가 업데이트되는 반면, 변경 불가능한 테이블은 기존 레퍼런스와 잘 어울리고 멋지다.변경 가능한 테이블을 참조하는 변경 불가능한 테이블을 처리하는 방법은 무엇입니까?

이렇게하는 것이 바람직한 방법은 무엇입니까? 이 일을 더 잘하고 영리하게 할 수있는 방법이 있습니까?

답변

2

다릅니다. 필자는 일종의 문서 관리 및 감사를 포함하는 매우 복잡한 엔터프라이즈 소프트웨어를 작성 중이며 약국에서 사용됩니다.

일반적으로 기본 값은 비정규 화됩니다. 예를 들어, 주문이 생성되었을 때 고객의 현재 상태 만 필요하면 주문에 저장합니다.

항상 거의 모든 시점에서 사용할 수있는 더 복잡한 데이터가 있습니다. 두 가지 접근법이 있습니다. 하나의 히스토리를 생성하거나 거의 동일한 개정 관리 시스템을 구현합니다.

이력은 존재했던 모든 상태가 동일하거나 다른 테이블에 별도의 레코드로 저장된다는 것을 의미합니다.

개정 관리 시스템을 구현했습니다. 여기에서 레코드를 두 개의 테이블로 나눕니다. 하나는 실제 항목을, 하나는 제품을 말하고 다른 하나는 버전을 나타냅니다. 이 방법으로 제품을 전체적으로 또는 특정 버전으로 참조 할 수 있습니다. 두 제품 모두 고유 기본 키를 가지고 있기 때문입니다.

이 시스템은 많은 엔티티에 사용됩니다. 리비전 제어하에있는 객체를 예를 들어 감사 기록에서 또는 다른 불변의 레코드로 안전하게 참조 할 수 있습니다. 처음에는 그러한 시스템을 갖는 것이 더 복잡해 보이지만 결국에는 매우 직설적이며 많은 문제를 즉시 해결합니다.

0

나는 비정규 화가 방법이라고 생각합니다.

또한 제품에는 가격이 없어야합니다 (가격이 다른 사람들에게 평균값이 다를 때 & -> 소매 업체, 고객, 대량 판매자 등).

제품의 가격 내역을 유지하기 위해 ProductID, FromDate, ToDate, Price, IsActive가 포함 된 가격 내역 테이블을 사용할 수도 있습니다.

0

제품 테이블과 OrderItem 테이블에 가격을 저장하는 것은 시간이 지남에 따라 가격이 변경 될 수있는 경우 비정규 화하지 않습니다. 정규화 규칙에 따르면 모든 "사실"은 데이터베이스에 한 번만 기록되어야합니다. 그러나이 경우 두 숫자가 모두 "가격"이라고 불리기 만하면 그 숫자가 똑같은 것은 아닙니다. 하나는 현재 가격이고 다른 하나는 판매 날짜 기준 가격입니다. 이들은 매우 다른 것들입니다."고객 우편 번호"와 "우편 번호 저장"이 완전히 다른 분야입니다. 두 가지가 모두 "우편 번호"로 불릴 수도 있다는 사실이 이들을 똑같이 만들지는 못합니다. 개인적으로, 나는 다른 데이터를 보유하는 필드에 혼란을 야기하기 때문에 같은 이름을주는 것에 강한 반대를한다. 나는 그들 모두를 "가격"이라고 부르지 않을 것입니다. 저는 하나를 "Current_Price"라고하고 다른 하나는 "Sale_Price"라고 부를 것입니다.

판매 시점의 가격을 유지하는 것은 분명히 잘못되었습니다. 우리가 그것을 알아야한다면 - 우리가 거의 확실하게 - 그것을 구원해야합니다.

매매마다 또는 가격이 변경 될 때마다 전체 제품 레코드를 복제하는 것도 잘못되었습니다. 가격이 바뀔 때마다 변경되지 않는 설명이나 공급자와 같은 제품에 대한 일정한 데이터가 거의 확실하게 있습니다. 제품 레코드를 복제하면이 모든 데이터를 복제하게됩니다. 이는 분명 비정규 화입니다. 이로 인해 많은 잠재적 문제가 발생합니다. 마찬가지로 누군가가 제품 설명에 철자 오류를 수정 한 경우 "4- 슬라이스 토스터"라고 말하는 이전 기록에 "4- 슬라이스 토스터"라는 새로운 기록이 생길 수 있습니다. 설명을 작성하고 보고서를 정렬하면 분리되어 다른 제품처럼 보입니다. 기타

제품에 관한 변경 사항과 관심있는 데이터 만 가격 인 경우 가격을 OrderItem 레코드에 게시합니다.

변경되는 데이터가 많이있는 경우 Product 테이블을 상수이거나 관심이없는 데이터와 추적해야하는 데이터에 대한 두 테이블로 나누고 싶습니다. 역사. 마찬가지로 설명, 공급 업체, 재고 번호, 배송 중량 등이 포함 된 ProductBase 테이블이 있어야합니다. 가격, 판매 가격 및 일상적으로 변경되는 사항이있는 ProductMutable 테이블이 있습니다. 또한 현재 날짜 또는 적어도 현재 날짜가 표시되어야합니다. ProductMutable의 기본 키는 Product_id와 As_of_date가 될 수 있습니다. 또는 모든 테이블에 대해 간단한 순차 키를 사용하려는 경우 product_id에 대한 참조가 있어야합니다. OrderItem 테이블은 ProductBase가 아닌 ProductMutable을 참조합니다. ProductMutable을 통해 ProductBase를 찾습니다.

관련 문제