概述
一个事件数据库,其中包含多个列,每个列都有一个ID来存储在查找表中的记录。
我要解决的问题
我需要想出一个强大的解决方案来管理历史数据,其中一些字段包含查找ID。 我列出了我的建议解决方案以及备选方案。 我想知道其他开发人员是否在其项目中以类似的方式管理这些情况。 也许您有更好的方法?
数据库:Oracle 10g
列:Department_name(部门名称)
场景:部门名称可以在一年内更改X次。业务需要报告所有部门的数据,但希望按照事故发生时部门的相应名称查看事故。
建议的解决方案:在设置部门名称查找表中的条目时,设置开始和结束日期值。使用视图,基于事件日期创建一个计算字段以在任何时间点访问正确的部门名称。
优点:通过少量的防御性编码,它将使选定用户能够通过GUI管理其静态数据,而无需进行任何其他数据库更改。可以进行即时更改,例如完全更改名称。不需要DBA支持。
缺点:在大型数据集上执行的查找/计算量可能很大,因此成本较高。
备选方案:简单地使用并插入部门名称的纯文本值。这里的缺点是需要DBA进行即席请求以更改/更新值,可能会针对特定的日期范围,并且错误地遗漏某些记录。还将增加表空间消耗。
列:Assigned_Technician_ID(已分配技术员ID)
场景:一个事件将有一个被分配的技术人员,技术人员的ID将被存储。一个查找表将保存所有可用技术人员的“当前”列表。随着人员离开企业,必须刷新列表并删除过时的技术人员。这是为了将下拉列表中的值的数量保持最少。业务仍将想要看到哪些技术人员被分配在其所有事件数据上。
解决方案:而不是从技术人员查找表中删除条目,标记该条目的标志表示“已归档/已删除”。此标志将作为GUI下拉列表中的过滤器,以删除不需要的条目。
优点:查找表将仅包含来自员工表的技术人员UID。因此,如果业务要求发生变化,则可以轻松地在主视图中呈现技术人员的任何属性,例如全名或员工编号等。
缺点: 与前面的例子一样,在大型数据集上进行查找可能是一个昂贵的操作。在业务逻辑和设计方面,需要额外的工作来处理下拉列表,特别是当原始条目被“归档”时。
替代方案: 如上面的先前示例中所述,只需使用纯文本值即可。这里的缺点是占用更多的表空间,并且在业务需求发生变化时不够灵活。
SELECTs
?请注意实体属性值模式。规范化,但不要“过度规范化”。 - Rick James