规范销售额

时间:2015-07-21 17:14:55

标签: sql sql-server database normalization

目前,有一个销售数据库,其中包含销售产品明细列以及一个表中的销售额。

例如: ProductID,ProductName,Jan14 ... Dec14,Jan15 ... Dec15

现在的问题是,由于我们每年不断添加12列以容纳销售额数据,因此目前列数太多。我们尝试将此表分为2个表,一个用于产品信息,另一个用于基于期间的销售额数据。关于如何构建销售额表的任何想法?

我们是每月的收款金额,那么销售金额表的期间标识符应该是多少? 应该是2015年1月的“201501”,还是每个销售月份和年份应该有2个单独的列。

2 个答案:

答案 0 :(得分:1)

首先,祝贺您决定规范数据。

这是一个非常简单的问题,答案非常简单。你只需要两张桌子:

  

产品表(ProductID,ProductName)

     

ProductSales表(ProductID,SalesPeriod,SalesAmount)

ProductIDProductName并不是什么新鲜事。在SalesPeriod列中,您可以存储总结销售总额的期间(2014年,2015年等,或者可能是2014Q1,2014Q2等,无论您想要总结的是什么); SalesAmount列是该期间的总销售额。

对于每个ProductSales / Product组合,您将为SalesPeriod填充一行。

最后,您向ProductSales添加一个外键,表示ProductID引用ProductID表中的Product列。

答案 1 :(得分:0)

我认为销售额是计算可以在需要时计算的数据。

但是如果计算需要很长时间而且你经常使用这些数据 可以创建销售额的分隔表

ProductID (INT PRIMARY KEY),产品信息表中的FOREIGN KEY
MonthNumber (INT PRIMARY KEY)
YearNumber (INT PRIMARY KEY)
Amount (DECIMAL)

产品信息表保持不变,销售期列除外

ProductID (INT PRIMARY KEY)ProductInfo (NVARCHAR)
OtherInfo (NVARCHAR)

然后每个月你只需为每个产品添加新行

金额的期间可以用不同的方式表示
根据您的需求:MonthYear只是表示销售期所需的值。 它可以很快出价查询数据而无需操纵和利用索引 例如,如果Period将表示为DateTime 那么WHERE MONTH(PeriodDate) = 4的查询将在不使用索引的情况下执行