数据库建模中的计划与实际实体

Planification vs Actual Entities in database modeling

作为小型初创公司的开发人员,我最近一直在从事几个项目,到目前为止,我已经多次遇到这个问题。当您有一个由计划和后来的实际事物组成的实体时该怎么办?

举个例子,假设一家公司想要记录他们所有的安全演习。当然,这意味着有人会为演习制定计划,也许会为演习选择日期和时间以及将参与其中的人员。这说明了实体的平面化。过了一会儿,演练真的发生了,所以我们想要记录发生的实际日期和时间(为简单起见,我们假设计划中的人总是与实际参与者相同)。

示例:

我在很多其他实际例子中看到过同样的情况,培训计划和实际培训,计划维护和实际维护,预算和实际费用等等。有时我们通过使用布尔属性来解决这个问题例如一个实体中的“计划”、“完成”、“完成”或“批准”。其他时候我们使用单独的实体,但尚未就更好的选择达成共识。

您认为解决此类问题的最佳选择是什么? PlanificationEntity 和实际实体?只是一个布尔值?

这完全取决于正在计划什么,所以没有单一的答案。

就您而言,演习似乎会随着时间的推移积累信息并改变状态。每次您进行计划时似乎都有一个单独的演习,并且只执行该演习。您可能只想保留当前状态,但我通常希望保留转换 tables 以了解何时发生某些事情。

变体可能是 class 或训练,其中有标准训练。这可能被存储为一个实体(比如 trainings)。然后您将有一个 training_schedule table,它可以有过去和未来的日期——以及一个唯一的 ID。然后参与者将被链接到 training_schedule.

另一个变化是预算与实际情况。在这种情况下,预算在很多方面都是它自己的实体,您想要命名并随着时间的推移保留它。实际值不断累积,您想比较它们。那将是一个不同的数据模型,因为可以同时激活多个预算(当年的原始预算和基于已经发生的实际情况的更新预算)。

规划实体应称为配置实体。像 drillConfiguration 和 drill。 DrillConfiguration 可以具有钻取日期和时间以及任何其他属性。而 drill 是具有用于 drillconfiguration 的外键属性的实际 drill。那是我的两分钱