2012-04-14 2 views
0

나는 이미 답변을 알고 있지만 아직도 귀하의 의견을 듣고 싶습니다.상점 데이터베이스의 과거 데이터 유지 보수

나는 간단한 상점 데이터베이스를 만들고 있습니다. 제품 테이블과 주문 테이블이 있고이 두 제품 사이에 Order2Product라는 접합 테이블을 만들어 주문 내용을 저장했습니다.

이 작은 모델에서는 Order2Product 테이블에 레코드를 추가하고 각 레코드의 수량을 설정하여 주문을 저장할 수 있습니다.

그러나이 모델은 기록 데이터를 유지하지 않습니다. 예를 들어, 상점 주인이 제품 3의 가격을 변경하고 제품 3이 1 년 전에 주문한 순서대로 변경되면 해당 주문의 가격이 변경되므로, 예를 들어, 주문 후 안정적으로 인보이스를 인쇄 할 수 없습니다. 주문이 접수되었습니다.

제품 이름도 동일합니다. 상점 주인이 제품 '사탕 상자'의 이름을 'Jack Daniel 's gift box'로 바꾸기로 결정한 경우 이는 인보이스의 재 인쇄에 이상하게 보입니다.

내 의견으로는 제품 외래 키가있는 제품에 연결하는 대신 제품 테이블의 이름과 가격을 Order2Product 테이블로 복사하는 것입니다.

당신은 어떻게 생각하십니까? 데이타를 복제하는 것은 데이타베이스 디자인에서 나쁜 습관이기 때문에 다소 재미 있습니다. 다른 한편으로, 나는 이것이 배치 된 주문의 신뢰성있는 기록을 유지하기를 원한다면 다른 해결책이없는 경우라고 생각한다.

대안 버전은 제품 개정판을 사용하여 레코드를 변경할 때마다 새로운 제품 레코드를 저장하는 것입니다. 그러나이 모델은 사용자가 Access 데이터 시트를 통해 데이터에 직접 액세스 할 수있는 Ms Access를위한 것이므로 제품 레코드를 수정할 수 있습니다.

답변

1

표준 솔루션은 Order2Product 테이블에 저장하는 세부 레코드에 가격과 기타 시간에 민감한 정보 (예 : 세율)를 저장하는 것입니다. 세부 레코드의 가격이 제품 레코드의 가격과 같지 않기 때문에 이것은 제 3 정규형의 손상이 아닙니다.

이것은 훌륭한 NorthWind 데이터베이스의 작동 방식입니다. 그것은 Microsoft Access와 함께 배포되는 예제 데이터베이스입니다.

+0

어쨌든 가격과 제품 이름과 세율을 복사 할 예정입니다. 명령이 내려 졌을 때의 상황을 반영하기 위해 청구서를 보내고 싶습니다. 감사. – Julius

+0

제품 이름을 복사하지 않지만 귀하의 요지를 말합니다. 송장을 다시 인쇄 할 수있는 법적 요구 사항이 있습니다. 또한, 제품 기록은 주자가 될 수 있습니다. 내 자신의 응용 프로그램의 경우입니다. 물론 고객 레코드의 정보를 주문 헤더에 복사 할 수도 있습니다. 이유는 마찬가지입니다. –

+0

아직 고객 정보를 생각조차하지 못했습니다. 좋은 지적. – Julius

1

한 항목이 "현재 가격"이고 다른 항목이 "날짜 x 가격"이기 때문에 가격에 대한 데이터를 복제하지 않습니다. 이것들은 같을 수도 있지만 그렇게 할 수는 없습니다 (당신이 인식하는 것처럼). 이름을 복사 할 필요는 없습니다. 제품 이름이 변경되면 주문을 묶어두기를 원하는 새로운 제품 (ID가 다른 제품) 또는 재배포 된 제품 (ID가 같은 제품) (당시 다른 제품 이름 임에도 불구하고)). 그래서 당신은 제품 ID에 연결하고 싶습니다. 다른 테이블에 이름 변경 기록을 보관하고 제품 레코드에 플래그를 지정할 수 있습니다.