我有以下需求
Sales Officer: Bob
Week1 Week2 Week3 ................. Week52
Prod1 10 15 12 ................. 14
Prod2 20 14 10 ................. 17
. .
. .
. .
销售主管每周都会为每位销售人员设定目标。
销售人员可以根据设定的目标通过类似的网格输入每种产品每天的实际销售额,例如
编辑
在上述案例中,主管为第 1 周设定了 10 个单位的目标现在销售人员将每天输入销售额 1,2,0,1,3,2=9(第 1 周的实际销售额),因此与目标不符10 个单元,他在第一周售出了 9 个单元。
我已经创建了 Employee 和 Product 表。谁能指导有关如何在数据库中存储天 和周 的最佳实践,根据这些数据库存储目标并记录实际销售额。
我正在考虑将数据存储在下表中
EmpSales (EmployeeID,ProductID,SaleTarget,Actual Sale,Date,WeekNo,Month)
提前致谢
最佳答案
这在纯关系建模术语中非常简单。我认为不需要任何形式的“非规范化”。
如果您不熟悉关系数据库建模标准,IDEF1X Notation可能会有帮助。
纯 5NF;完整的声明性参照完整性;没有空值,没有更新异常;没有 GROUP BYs
;纯日期算术。
SaleTarget
通过投影与SaleActual
进行比较,并且可能在同一结果集中。如果您有月度和年度销售核算,则需要的扩展是具有一定控制或结构的通用日历表;例如。类似于
Week
,包括每个月和年的行。请告诉我,我会更新模型。我说 5NF 是因为这是我为消除更新异常而提供的最小值,大多数建模者都熟悉它。但如果它没有吓到你,这两个 Sales 表实际上是第六范式。
这允许在没有临时表或复杂 SQL 的情况下进行完全透视(周或月在顶部;产品或员工在侧面;反之亦然;任何组合)。 (随便问。)
我认为它甚至可能是不言自明的,但我将提供阐明业务规则的动词短语,只是因为每个规则涉及三个父项:
- 每个员工都被安排了一周的产品销售目标
- 每个产品都按员工安排的销售目标为一周
- 每个员工当天都完成了产品的实际销售
- 每个产品在当天由员工完成 SaleActual
比较
- 我应该提一下。请注意,没有垂直(行)或水平(列)重复。当列重复时,例如
StartDate
和EndDate
,您已经破坏了 3NF(引入了功能依赖性),并引入了更新异常。任何行中的EndDate
都是下一行中的StartDate
(负 1 秒算作骗局,是一种设计);更新时,现在必须更改两行而不是一行。更重要的是,这个结构非常简单(它不是时间序列或“时间”要求),EndDate
不是必需的。
回应评论
数据模型已更新为包含
月
和年
要求。您现在需要对 SaleTarget 进行检查约束以确保DateType
为W
一周。加载日期表很简单,你不需要SQLTeam上发布的废话代码(手动重复剪切和粘贴);他们以愚蠢和不合标准而闻名。SaleActual
表现在包含每日、每周、每月和每年的值。当然,您可以在每周、每月、每天的第一天以编程方式进行总结。首先将新行添加到Date
。5NF 几乎是当今标准合规性的最低要求,因此您需要习惯它。基本上,对于 3NF 和 5NF 之间的 NF,学术界(以及像维基百科这样发布完全不正确的条目的地方)有很多争论。 5NF 的简短而贴切的定义是它是 3NF 的本意,零数据重复,零更新异常(没有重复的列要事务更新)。
暂时忘掉 6NF。 6NF 中的任何表都在 5NF 中(以及 4NF 和 BCNF 和 3NF)。只需将两个 Sales 表视为 5NF。当您必须编写旋转报告时,比如一年后,您就会意识到这种结构的值(value)。
关于sql-server - 将每周目标存储在数据库中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4409003/