製品割引を提供するためにデータベースソリューションを作成する必要があります。データベース設計ブレーンストーミング:販売価格
現在のテーブル:
Products
Columns: ProductId, ProductTypeId, ReleaseDate
ProductPrices
Columns: ProductPriceId, ProductPriceTypeId (one product may have n prices), ProductId, Price
我々はのProductIdおよび/またはProductTypeIdおよび/またはProductPriceTypeIdおよび/またはRELEASEDATEによって値引きすることができるようにしたいです。
例販売:
- ディスカウント単一のProductId。
- 指定したProductTypeIdと ProductPriceTypeIdのすべての商品をディスカウントします。
- 指定した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) :
}
私は私がどのように最終的な結果を示すことを思い付いたこの悪い例を含め私は、この新製品ディスカウント機能を使用できるようにする必要があります。このような状況に対処するための良い方法についてアドバイスを提供することはできますか?ありがとう。