2012-01-27 12 views
3

製品割引を提供するためにデータベースソリューションを作成する必要があります。データベース設計ブレーンストーミング:販売価格

現在のテーブル:

Products 
Columns: ProductId, ProductTypeId, ReleaseDate 

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

我々はのProductIdおよび/またはProductTypeIdおよび/またはProductPriceTypeIdおよび/またはRELEASEDATEによって値引きすることができるようにしたいです。

例販売:

  1. ディスカウント単一のProductId。
  2. 指定したProductTypeIdと ProductPriceTypeIdのすべての商品をディスカウントします。
  3. 指定したProductTypeIdのすべての商品を、先月末に ReleaseDateでディスカウントします。

#2の難題は、リテラルの例ではなく、今後新しいフィールドが追加される場合の長期的なスケーラビリティを考慮しています。

ReleaseDateのため#3を処理する方法がわかりません。

下記は、私がStackoverflowに来る必要があることを知る前に精神的に考えたことです。明示的に列が含まれているため、厳格な構造ではスケーラビリティが向上しないことがわかります。将来新しい基準を追加すると、列をテーブルに追加する必要があります。 ReleaseDateの要件。

新しいテーブル:

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 Sとファンキーな計算と

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 

ザ・ようなもの...

関連する問題