历史表:1对2外键

时间:2017-09-21 17:16:18

标签: sql postgresql

我有一个“controller_variables”表,我保存了一些传感器的当前值:

  • id :记录的ID
  • controller_id(FK):提供数据的控制器的ID
  • variable_id(FK):variable_id
  • :当前变量值
  • created_at :创建日期
  • updated_at :更新日期

我还有“history_controller_variables”表,其中保存了“controller_variables”表的“快照”:

  • id :记录的ID
  • controller_variable_id(FK):controller_variables记录的ID
  • :“历史记录”读取值
  • created_at :历史值的创建日期

我发现自己有几次想知道为什么我将“history_controller_variables”表连接到“controller_variables”表。

如果我将历史表创建为原始表的精确克隆,我可以:

  • 保留我的历史记录以防删除引用的“controller_variables”记录。
  • 通过直接查询某个controller_id / variable_id的记录来获取历史记录。

我想不出为什么不做这个改变的原因。是否有明显的理由不继续进行这种改变?

2 个答案:

答案 0 :(得分:1)

你在这里有一个相当大的权衡。我不知道哪个更好,但我可以告诉你每个的优点是什么。

如果您的控制器的变量不会改变,那么您希望使用一个外键。这使得更容易确保正确性,历史记录表示给定控制器的有效值。另一方面,如果这些更改并且您从控制器变量表中删除了记录,则会遇到一个没有简单解决方案的问题。因此,在这种情况下,最好使用两个。

最终,我们永远不会知道未来,因此我倾向于接受奇怪数据的风险,以确保运营和历史数据受到不同的关注,并且改变数据并不会使历史混乱

答案 1 :(得分:0)

这是一个很好的改变。将历史表作为原始表的克隆,但将时间戳列添加到历史记录表中。每当变量值更改时,使用新值在历史记录表中创建新记录,并使时间戳指示变量何时更改为该值。如果适用于您的应用程序,您还可以在历史记录表中包含一列,指示将变量修改为新值的人(或内容)。