2012-01-27 3 views
3

제품 할인을 제공하기 위해 데이터베이스 솔루션을 만들어야합니다.데이터베이스 디자인 브레인 스토밍 : 판매 가격

현재 테이블 :

Products 
Columns: ProductId, ProductTypeId, ReleaseDate 

ProductPrices 
Columns: ProductPriceId, ProductPriceTypeId (one product may have n prices), ProductId, Price 

우리는 제품 ID 및/또는 ProductTypeId 및/또는 ProductPriceTypeId 및/또는 RELEASEDATE 할인 할 수 있어야합니다.

예 판매 :

  1. 할인 단일 제품 ID.
  2. 지정된 ProductTypeId 및 ProductPriceTypeId의 모든 제품을 할인합니다.
  3. 지정된 ProductTypeId의 모든 제품을 지난 달 내에 ReleaseDate로 할인합니다.

# 2의 도전적인 측면은 문자 그대로의 예제가 아니지만 미래에 새로운 필드가 추가 될 경우 장기적인 확장 성을 고려해야합니다.

ReleaseDate 때문에 # 3을 처리하는 방법이 난처한 상황입니다.

아래는 내가 Stackoverflow에 올 필요가 있다는 것을 깨닫기 전에 정신적으로 생각한 것입니다. 명시 적으로 포함 된 열 때문에 견고한 구조가 좋은 확장 성을 허용하지 않는다는 것을 알 수 있습니다. 미래에 새로운 기준을 추가하면 해당 열을 테이블에 추가해야 할 필요가 있습니다. 출시일 요건.

새로운 테이블 :

ProductPriceDiscounts 
Columns: ProductPriceDiscountId, ProductPriceId, ProductTypeId, ProductPriceTypeId, Discount, DiscountTypeId (1 for percentage, 2 for fixed) 

가 그럼 난 가격 얻기 위해이 같은 것을 사용할 수 있습니다 : 만이 나쁜 예제를 포함

from p in Products 
join pp in ProductPrices on p.ProductId equals pp.ProductId 
let ppd = (
    from ppd in ProductPriceDiscounts 
     .WhereIf(ppd.ProductPriceId != null, ppd.ProductPriceId == pp.ProductPriceId) 
     .WhereIf(ppd.ProductTypeId != null, ppd.ProductTypeId == pp.ProductTypeId) 
     .WhereIf(ppd.ProductPriceTypeId != null, ppd.ProductPriceTypeId == pp.ProductPriceId) 
    select ppd).FirstOrDefault() 
where p.ProductId = productId 
select new 
{ 
    ..., 
    Price = pp.Price, 
    Discount = pp.Discount, 
    DiscountedPrice = 
     (ppd.DiscountTypeId == 1) ? 
      (pp.Price - (pp.Price * pp.Discount)) : 
      (pp.Price - pp.Discount) : 
} 

나는 방법의 최종 결과를 보여주기 위해 함께했다 이 새로운 제품 할인 기능을 사용할 수 있어야합니다. 이 상황을 처리하는 좋은 방법에 대한 조언을 누군가가 제공 할 수 있습니까? 감사.

답변

1

내가가는 종료 내 원래의 디자인으로, 그리고 내가 SQL에 linq를 사용하여 데이터베이스를 쿼리하면, 나는 "DiscountedPrice"방법을 사용하여 얻을. 이 메서드는 자체 쿼리를 실행하고 결과를 반환하기 전에 조건부 논리를 수행합니다. 따라서 이것은 내 쿼리가 할 수없는 추가 작업을 내 코드에서 수행 할 수있는 옵션을 제공합니다. 특별한 ProductPriceDiscountIds에 대해 Enum 클래스를 만들어 쉽게 식별 할 수 있도록했습니다. 나는 이것이 비슷한 상황에 처한 다른 사람들을 돕기를 바랍니다. 그것은 지금까지 저에게 매우 잘 작동하고 있습니다.

2

별도의 DiscountDetail 테이블이 필요합니다. 모든 제품/유형과 특정 시간에 할인 된 가격의 목록을 얻을 수 있어야합니다 일부 사랑스러운 left join의 펑키 계산에

DiscountDetailID INT NOT NULL 
    DiscountTypeID INT NOT NULL --(FK On Discount Types - maybe not necessary) 
    DiscountProductTypeID INT NULL --(FK ON ProductType) 
    DiscountProductID INT NULL --(FK ON Product) 
    DiscountAmount INT NULL --(Some value related to %age reduction perhaps?) 
    DiscountDateStart DATETIME NOT NULL 
    DiscountDateEnd DATETIME NULL 

등 뭔가 ...

관련 문제