我正在设计一个需要存储事务时间和有效时间的数据库,我正在努力解决如何有效地存储数据以及是否对属性进行完全时间规范化的问题。例如,我有一个表Client,它具有以下属性:ID,Name,ClientType(例如公司),RelationshipType(例如客户,潜在客户),RelationshipStatus(例如Active,Inactive,Closed)。 ClientType,RelationshipType和RelationshipStatus是时变字段。性能是一个问题,因为此信息将链接到遗留系统的大型数据集。同时,数据库结构需要易于维护和修改。 我打算将审计跟踪和时间点历史分成不同的表,但我正在努力解决如何做到这一点。
我有一些想法:
1)三个表:Client,ClientHist和ClientAudit。客户端将包含当前状态。 ClientHist将包含任何以前有效的状态,ClientAudit将用于审计目的。为了便于讨论,让我们忘记ClientAudit并假设用户从未犯过数据输入错误。这样做,我有两种方法可以更新数据。首先,我总是可以要求用户提供生效日期并将记录保存到ClientHist,这会导致每次更改字段时都会将记录写入ClientHist。或者,我只能要求用户在其中一个时变属性(即ClientType,RelationshipType,RelationshipStatus)发生变化时提供生效日期。这将导致仅在更改时变属性时才将记录写入ClientHist。
2)我可以将时变属性拆分成一个或多个表。如果我走这条路线,我是将所有三个放在一个表中还是创建两个表(一个用于RelationshipType和RelationshipStatus,另一个用于ClientType)。为时变属性创建多个表会显着增加数据库设计的复杂性。每个表也都有相关的审计表。
有什么想法吗?
答案 0 :(得分:0)
很大程度上取决于(或者我认为)时间敏感数据的更改频率。如果变化不频繁,那么我会选择(1),但如果变化发生很多而不一定对所有时间敏感值一次,那么(2)可能更有效 - 但我想要首先要非常谨慎地考虑,因为它很难管理和维护。
我喜欢要求用户输入有效daes的想法,因为这可以减少你节省多少细节 - 例如,无论他们今天做了多少改变,它只产生一个历史记录行明天的效果(尽管审计表可能会变得很大)。但是,您真的可以让用户输入有些抽象的数据吗?
答案 1 :(得分:0)
您可能希望尝试使用包含4个日期列的单个客户端表来处理2个时间维度。 类似的东西(client_id,...,valid_dt_start,valid_dt_end,audit_dt_start,audit_dt_end)。 这个设计非常简单,我会尝试看看在进行更复杂的事情之前如何进行缩放。