Database 用于跟踪更改名称的对象的模型

Database 用于跟踪更改名称的对象的模型,database,database-design,database-schema,Database,Database Design,Database Schema,我遇到了一个有趣的问题。我继承了一个用于守护进程的数据库,该进程轮询并接受来自远程嵌入式系统的报告。每个拥有其中一个系统的站点都可以监控十几个不同的油箱。(实际上,大多数监控2、3或4个储罐。) 当发生某些情况时,例如油箱被重新加注或油箱达到最低液位,程序会将该事件保存在Postgres数据库中。按照最初构建数据库的方式,它将每个燃油箱(燃油类型等)的所有信息保存在事件记录中,即使有单独的“tanks”表。我向表中添加了一个外键字段以将其与特定的嵌入式单元相关联,并向事件表中添加了一个外键以将其

我遇到了一个有趣的问题。我继承了一个用于守护进程的数据库,该进程轮询并接受来自远程嵌入式系统的报告。每个拥有其中一个系统的站点都可以监控十几个不同的油箱。(实际上,大多数监控2、3或4个储罐。)

当发生某些情况时,例如油箱被重新加注或油箱达到最低液位,程序会将该事件保存在Postgres数据库中。按照最初构建数据库的方式,它将每个燃油箱(燃油类型等)的所有信息保存在事件记录中,即使有单独的“tanks”表。我向表中添加了一个外键字段以将其与特定的嵌入式单元相关联,并向事件表中添加了一个外键以将其与特定的坦克相关联

现在问题来了:油箱可以随时添加、移除或更换所储存的燃油类型。添加储罐应该不会有问题,但如果移除一个储罐,记录的事件将“孤立”。更糟糕的是,如果燃料类型发生了变化,从“喷气式飞机”变为“火箭”,那么当有人翻阅历史时,他们会认为所有这些旧事件都发生在“火箭”燃料上,而事实上它们发生在“喷气式飞机”燃料上

我在离线时收到了一些建议:(1)创建第二个坦克存档表,当有任何变化时,将该坦克记录及其唯一ID移动到存档表,并为坦克的新状态创建一个具有新ID的新记录,或者(2)在坦克表中添加一个“活动”字段,并在规格更改时仍创建新行,但仅将坦克的当前状态标记为“活动”


有人对这些建议的解决方案或其他可行的想法有什么看法吗?

问题出在哪里?所有相关信息均在事件记录中;或者,当您创建储罐和事件之间的链接时,您没有保留储罐信息。从事件表中删除燃料类型并不是问题,而是导致问题的原因

为什么要将信息持久化转发,有几个原因。其中之一就是历史。通过将这些表链接回一个tank实体,它可以向您显示当前的状态。如果“类型”与储罐表上的类型不同,事件表将显示历史记录

我想我对这个问题还不够了解:

即使删除储罐,用户是否希望看到所有事件

在储罐和储罐类型的事件之间添加具有开始和结束日期的关联表是否可以解决问题

将某些坦克信息保留到事件中有什么不对?这样您就可以知道事件发生时油箱的状态了吗

添加油箱应该不会有问题,但如果一个油箱被移除,这些油箱就不会有问题了 记录的事件将是“孤立的”。如果燃油类型为 改变了,从说“喷气机”到“火箭”,然后当有人搜索时 纵观历史,他们会认为所有这些旧事件都发生在他们身上 “火箭”燃料,而事实上他们碰巧是“喷气”燃料


只是因为有人在没有完全理解原始设计的情况下添加了外键约束。看看你是否能找到那个人,然后和他严肃地谈话。经常摇动手指。

问问自己:问题出在哪里,为什么出在哪里。如果你这样做几次,你可能会看到为什么设计是原来的样子,或者你会发现你真正的问题。我在专注于应用程序的其他部分一段时间后又回到了这个问题上。我确实保留了事件中的原始信息——我只是想设法避免在事件表上进行文本搜索,并将其放入tanks表的索引列中。我想我最终会在tanks表中添加一个活动标志,并将查找非活动(失效)坦克的历史记录作为管理函数。