0

我正在设计一个.accdb用于项目管理的 Access。项目合同规定了每个项目的多个里程碑,并附有相关日期。里程碑的确切数量取决于项目规模的“非此即彼”情况,但最多 6 个

我的雇主想跟踪每个里程碑的[Forecast]日期、[Actual]日期和[Paid]日期,这意味着大型项目最终有 24 个与之相关的日期,通常重复(如果项目按时运行,所有四个日期都将相同)

目前,我有tblMilestones,它有一个 FK 链接tblProject和每个里程碑的记录,其中 4 个关联的日期作为记录中的字段和一个用于将里程碑标记为完成或当前的字段。

我觉得我们正在收集、存储和输入大量毫无意义的数据——尤其是[Forecast]日期,我们从项目经理那里收集数据(无论如何都不是最可靠的数据)。一旦里程碑完成并[Actual]输入日期,[Forecast]日期就毫无意义

我宁愿将合同日期放在一个表中,在添加新项目时输入,在可变预测日期的报告表中输入,在用户将里程碑标记为完成时设置实际日期,并从交易记录中提取付款日期。

这是更好的设计方法吗?数据库很小 - 不到 50 个项目,所以我的一部分认为我只会让事情变得比他们需要的更复杂,特别是在所需的额外 UI 方面。

4

1 回答 1

0

从维度数据仓库设计中取出一个页面,并将日期存储在他们自己的带有 DateID 的表中:

DateID  DateValue
------ ----------
     1 2000-01-01
   ...        ...
  9999 2012-12-31

然后将您的所有日期字段——预测、实际、支付等——转换为对日期表的 DateID 字段的外键引用。

要填充日期表,您可以采用两种方式:

  1. 使用一些 VBA 生成大量日期,例如 2005-01-01 到 2100-12-31,并将它们作为一次性操作插入到日期表中。

  2. 每当有人输入新日期时,请检查日期表以查看它是否已存在,如果不存在,请插入它。

无论采用哪种方式,显然都需要 DateValue 上的索引。

Taking a step back from the actual question, I'm realising that you're trying to fit two different uses into the same database--regular transactional use (as your project management app) and analytical use (tracking several different dates for your milestones--in other words, the milestone completion date is a Slowly Changing Dimension). You might want to consider splitting up these two uses into a regular transactional database and a data warehouse for analysis, and setting up an ETL process to move the data between them.

This way you can track only a milestone completion date and a payment date in your transactional database and the data warehouse will capture changes to the completion date over time. And allow you to do analysis and forecasting on that without bogging down the performance of the transactional (application) database.

于 2013-02-21T04:08:40.473 回答