Database 双时态数据库设计问题

Database 双时态数据库设计问题,database,database-design,architecture,Database,Database Design,Architecture,我正在设计一个需要存储事务时间和有效时间的数据库,我正在努力解决如何有效地存储数据以及是否对属性进行完全时间规范化的问题。例如,我有一个表客户端,它具有以下属性:ID、名称、ClientType(例如公司)、RelationshipType(例如客户端)、prospect、RelationshipStatus(例如活动、非活动、关闭)。ClientType、RelationshipType和RelationshipStatus是时变字段。性能是一个问题,因为这些信息将链接到遗留系统中的大型数据集

我正在设计一个需要存储事务时间和有效时间的数据库,我正在努力解决如何有效地存储数据以及是否对属性进行完全时间规范化的问题。例如,我有一个表客户端,它具有以下属性:ID、名称、ClientType(例如公司)、RelationshipType(例如客户端)、prospect、RelationshipStatus(例如活动、非活动、关闭)。ClientType、RelationshipType和RelationshipStatus是时变字段。性能是一个问题,因为这些信息将链接到遗留系统中的大型数据集。同时,数据库结构需要易于维护和修改。 我计划将审计跟踪和时间点历史分割成单独的表,但我正在努力解决如何最好地做到这一点

我有一些想法:

1三个表:客户端、客户端和客户端。客户端将包含当前状态。ClientList将包含任何以前有效的状态,ClientAudit将用于审计目的。为了便于讨论,让我们忘掉ClientAudit,假设用户从未犯过数据输入错误。这样做,我有两种方法可以更新数据。首先,我可以随时要求用户提供一个生效日期,并将一条记录保存到ClientList,这将导致在每次更改字段时将一条记录写入ClientList。或者,我只能要求用户在其中一个时变属性(即ClientType、RelationshipType、RelationshipStatus)更改时提供生效日期。这将导致记录仅在时变属性更改时写入ClientList

2我可以将时变属性拆分为一个或多个表。如果我这样做,我是将所有三个表放在一个表中还是创建两个表一个用于RelationshipType和RelationshipStatus,一个用于ClientType。为时变属性创建多个表会显著增加数据库设计的复杂性。每个表也将有关联的审计表


有什么想法吗?

很大程度上取决于时间敏感数据的更改频率。如果更改很少,那么我会选择1,但是如果更改频繁并且不一定同时对所有时间敏感的值进行更改,那么2可能更有效,但我希望首先仔细考虑,因为它很难管理和维护


我喜欢要求用户输入有效的DAE的想法,因为这可以减少您正在保存的详细信息。例如,不管他们今天做了多少更改,它只会生成一个明天生效的历史记录行,尽管审核表可能会变得相当大。但是你真的能让用户输入一些抽象的数据吗?

很大程度上取决于时间敏感数据的更改频率。如果更改很少,那么我会选择1,但是如果更改频繁并且不一定同时对所有时间敏感的值进行更改,那么2可能更有效,但我希望首先仔细考虑,因为它很难管理和维护


我喜欢要求用户输入有效的DAE的想法,因为这可以减少您正在保存的详细信息。例如,不管他们今天做了多少更改,它只会生成一个明天生效的历史记录行,尽管审核表可能会变得相当大。但是,您真的可以让用户输入一些抽象的数据吗?

您可能希望尝试使用一个包含4个日期列的客户机表来处理2个时间维度。 比如客户端id,…,有效开始,有效结束,审计开始,审计结束。
这种设计非常简单,我会尝试在使用更复杂的东西之前看看如何缩放

您可能希望尝试使用一个包含4个日期列的客户机表来处理2个时间维度。 比如客户端id,…,有效开始,有效结束,审计开始,审计结束。
这种设计非常简单,我会尝试在使用更复杂的东西之前看看如何缩放

谢谢重播!ClientType几乎不会改变,如果有的话。但如果它真的存在,我们需要知道在给定的点上它是什么。客户关系类型和状态将更频繁地更改,但不会经常更改。另一个想法是将RelationshipType和RelationshipStatus拆分为单独的表。是的,我同意让用户输入日期。但他们别无选择,因为他们是想要历史性地追踪这些数据的人。我的问题是如何使数据输入直观。他们将不得不在更新错误信息和实际数据更改之间进行区分。使用生效日期是否更改,但
这并不是100%,因为他们可能只是在纠正一个错误的生效日期。为了让它更直观,您是否可以设计一些东西,让用户在输入重要数据时,他们知道/被告知更改将在一天结束时生效,即第二天开始?也许在下一个工作周的周一开始?如果生效日期总是以相同的方式计算,他们就不必担心它。如果他们在之前的更改激活之前输入后续更改,那么根据定义?以前和现在被覆盖的条目是不正确的信息。是的,我认为这是一个好主意。非常感谢您花时间回复!在Stack Overflow中,如果您同意或批准答复,无论是对您自己的问题还是对他人的问题,请记住对其进行投票。感谢您的重播!ClientType几乎不会改变,如果有的话。但如果它真的存在,我们需要知道在给定的点上它是什么。客户关系类型和状态将更频繁地更改,但不会经常更改。另一个想法是将RelationshipType和RelationshipStatus拆分为单独的表。是的,我同意让用户输入日期。但他们别无选择,因为他们是想要历史性地追踪这些数据的人。我的问题是如何使数据输入直观。他们将不得不在更新错误信息和实际数据更改之间进行区分。使用是否更改生效日期,但这不是100%,因为他们可能只是在更正错误的生效日期。为了更直观,您是否可以设计一些东西,让用户在输入重要数据时,知道/被告知更改将在一天结束时生效,即第二天开始?也许在下一个工作周的周一开始?如果生效日期总是以相同的方式计算,他们就不必担心它。如果他们在之前的更改激活之前输入后续更改,那么根据定义?以前和现在被覆盖的条目是不正确的信息。是的,我认为这是一个好主意。非常感谢您花时间回复!在Stack Overflow中,如果您同意或赞成回答,无论是对您自己的问题还是对其他人的问题,请记住向上投票。