在SQL-Server中设计表时需要建议

时间:2009-12-17 16:40:19

标签: sql-server-2005 architecture data-structures hierarchy

我有一个包含项目的报价(存储在表QuoteItem中):
QuoteItemId,QuoteId,ItemId,Quantity etc。

现在,我需要能够在报价中创建一组选定的项目并对其应用折扣。 嗯,这很简单,我创建了两个表:
组:GroupId,DiscountPercentage
GroupQuoteItem:GroupId,QuoteItemId

假设我的报价中有30个项目。 我从报价中创建了一个包含1-20项的组,并对其应用了折扣。 现在我需要另一个包含项目10-30的组,问题是关于那些内部10项,我需要控制折扣是否应该在其他折扣之后应用于项目,或者它应该在项目的基本价格上。
例如,我要谈谈项目编号。报价中的15:QuoteItem.Cost = 100 我申请了10%= 90的第一次折扣 现在我想应用第二个折扣,我需要能够控制折扣是否应该在100上或者应该在90上。 同样的,当我有多个折扣组,当我想应用复杂的折扣架构时。

非常感谢任何帮助。

4 个答案:

答案 0 :(得分:1)

我会考虑在GroupQuoteItem表GroupQuoteItem.Priority中添加一列。此列将用于确定最终价格的查询中。如果你有相同,最高优先级的N折扣,它们将叠加在一起(顺序无关紧要,这要归功于乘法的相关性)。

如果稍后删除所有这些优先级高的折扣,则优先级较低的折扣可以取代它们。这可以帮助您设置相当复杂的折扣结构。

我希望至少能让你从某个地方开始。

答案 1 :(得分:0)

这实际上取决于您自己的业务规则。您想在折扣后或原价上应用折扣吗?当您提出这样的问题时,它会对SAMPLE数据有所帮助,然后向我们展示预期的结果。

答案 2 :(得分:0)

当您想要存储您可以计算的数据时,这可能是标准化中罕见的时间之一。因此,在QuoteItem中,您可以拥有Cost字段和DiscountedCost字段。如果它们是相同的,那么您知道没有应用折扣,如果不是,则应用折扣。通过这个字段,您还可以对折扣已经是什么以及是否要添加额外折扣进行比较。实际上,您还可以将该数字存储在ExistingDiscount字段中。

答案 3 :(得分:0)

为什么不在Group表中存储一个列,该列指定折扣是否可以与其他折扣一起累积,而不是仅必须应用于基本价格?您可以将字段命名为“ApplyToBasePriceOnly。”

除此之外,我同意JonH的观点,即很多这种逻辑应该放在业务规则中。我认为你的通用数据库结构看起来很不错。