sql-server - 将每周目标存储在数据库中

标签 sql-server database database-design relational-database

我有以下需求

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)

提前致谢

最佳答案

这在纯关系建模术语中非常简单。我认为不需要任何形式的“非规范化”。

Sales Data Model .

如果您不熟悉关系数据库建模标准,IDEF1X Notation可能会有帮助。

纯 5NF;完整的声明性参照完整性;没有空值,没有更新异常;没有 GROUP BYs;纯日期算术。

  • SaleTarget 通过投影与 SaleActual 进行比较,并且可能在同一结果集中。

  • 如果您有月度和年度销售核算,则需要的扩展是具有一定控制或结构的通用日历表;例如。类似于 Week,包括每个月和年的行。请告诉我,我会更新模型。

  • 我说 5NF 是因为这是我为消除更新异常而提供的最小值,大多数建模者都熟悉它。但如果它没有吓到你,这两个 Sales 表实际上是第六范式

  • 这允许在没有临时表或复杂 SQL 的情况下进行完全透视(周或月在顶部;产品或员工在侧面;反之亦然;任何组合)。 (随便问。)

我认为它甚至可能是不言自明的,但我将提供阐明业务规则的动词短语,只是因为每个规则涉及三个父项:

  • 每个员工都被安排了一周的产品销售目标
  • 每个产品都按员工安排的销售目标为一周
  • 每个员工当天都完成了产品的实际销售
  • 每个产品在当天由员工完成 SaleActual

比较

  1. 我应该提一下。请注意,没有垂直(行)或水平(列)重复。当列重复时,例如 StartDate EndDate,您已经破坏了 3NF(引入了功能依赖性),并引入了更新异常。任何行中的 EndDate 都是下一行中的 StartDate(负 1 秒算作骗局,是一种设计);更新时,现在必须更改两行而不是一行。更重要的是,这个结构非常简单(它不是时间序列或“时间”要求),EndDate 不是必需的。

回应评论

  1. 数据模型已更新为包含 要求。您现在需要对 SaleTarget 进行检查约束以确保 DateTypeW 一周。加载日期表很简单,你不需要SQLTeam上发布的废话代码(手动重复剪切和粘贴);他们以愚蠢和不合标准而闻名。

  2. SaleActual 表现在包含每日、每周、每月和每年的值。当然,您可以在每周、每月、每天的第一天以编程方式进行总结。首先将新行添加到 Date

  3. 5NF 几乎是当今标准合规性的最低要求,因此您需要习惯它。基本上,对于 3NF 和 5NF 之间的 NF,学术界(以及像维基百科这样发布完全不正确的条目的地方)有很多争论。 5NF 的简短而贴切的定义是它是 3NF 的本意,零数据重复,零更新异常(没有重复的列要事务更新)。

  4. 暂时忘掉 6NF。 6NF 中的任何表都在 5NF 中(以及 4NF 和 BCNF 和 3NF)。只需将两个 Sales 表视为 5NF。当您必须编写旋转报告时,比如一年后,您就会意识到这种结构的值(value)。

关于sql-server - 将每周目标存储在数据库中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4409003/

相关文章:

sql - 需要根据 SQL 中的 Number 列乘以行

PHP SQL Server 无法连接

sql-server - 主键在sql server中总是有索引吗?

php - 无法将验证码数据插入mysql数据库

database - 单元测试数据库转换有什么好的策略或工具? (不是单元测试数据库,而是转换)

sql - 当您有这样的发票表时是否需要付款表?

php - 如何创建 MLM 表设计

mysql - 设计数据库并使用 mySQL 进行查询 - 不确定我是否正确建模?

java - 使用 Java 和 Hibernate 从存储过程获取返回值(标量),而不是结果表

php - MySQL - 对潜在的小字符串使用 TEXT 是不是有点矫枉过正?