我正在为项目管理设计Access .accdb
。项目合同规定了每个项目的若干里程碑,并附有相关日期。里程碑的确切数量取决于项目规模的“任一/或”情况,但最多为6
我的雇主希望跟踪每个里程碑的[Forecast]
日期,[Actual]
日期和[Paid]
日期,这意味着大型项目最终会有24个与之相关的日期,通常会重复(如果项目运行时间,则所有四个日期都相同)
目前,我有tblMilestones
,它有一个FK链接到tblProject
和每个里程碑的记录,其中4个关联日期作为记录中的字段,以及一个字段,用于将里程碑标记为完成或当前。
我觉得我们正在收集,存储和输入大量非常无意义的数据 - 尤其是[Forecast]
日期,我们从项目经理那里收集数据(不是最可靠的数据)。里程碑完成并输入[Actual]
日期后,[Forecast]
日期毫无意义
我宁愿将合同日期放在一个表格中,在添加新项目时输入,更改预测日期的报告表格,设置用户将里程碑标记为完成时的实际日期,并从交易记录中提取付款日期
这是一种更好的设计方法吗? db很小 - 不到50个项目,所以我认为我只是让事情变得比他们需要的更复杂,特别是在需要额外的UI方面。
答案 0 :(得分:0)
使用DateID:
从维度数据仓库设计中创建一个页面,并将日期存储在自己的表中DateID DateValue
------ ----------
1 2000-01-01
... ...
9999 2012-12-31
然后将所有日期字段 - 预测,实际,付费等 - 转换为对日期表的DateID字段的外键引用。
要填充日期表,您可以采用两种方式:
使用一些VBA生成大量日期,例如2005-01-01至2100-12-31,并将它们作为一次性操作插入日期表中。
每当有人输入新日期时,请检查日期表以查看它是否已存在,如果没有,请插入日期表。
无论你采用哪种方式,你显然都需要DateValue上的索引。
从实际问题退后一步,我意识到你正试图在同一个数据库中使用两种不同的用途 - 常规交易使用(作为你的项目管理应用程序)和分析用途(跟踪几个不同的日期)对于您的里程碑 - 换句话说,里程碑完成日期是一个缓慢变化的维度。您可能需要考虑将这两种用法拆分为常规事务数据库和数据仓库以进行分析,并设置ETL过程以在它们之间移动数据。
这样,您只能在事务数据库中跟踪里程碑完成日期和付款日期,数据仓库将捕获对完成日期的更改。并允许您对此进行分析和预测,而不会降低事务(应用程序)数据库的性能。