2011-11-07 37 views
0

我遇到了一个有趣的问题。我已经继承了守护进程的数据库,用于轮询和接受来自远程嵌入式系统的报告。拥有其中一个系统的每个站点都可以监视十几个不同的油箱。 (实际上,大多数显示器2,3或4个坦克。)跟踪更改名称的对象的模型

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

现在问题就出现了:坦克可以随时添加,移除或使其储存的燃料类型发生变化。添加坦克不应该是一个问题,但如果一个被删除,那些记录的事件将是“孤儿”。更糟糕的是,如果燃料的种类发生变化,从“喷射”到“火箭”,那么当有人搜索历史时,他们会认为所有这些旧事件都发生在“火箭”燃料上,事实上他们碰巧遇到了“喷气燃料。

我收到了一些离线建议:(1)制作坦克的第二个归档表格,当有任何变化时,将该坦克记录及其唯一ID移动到归档表格中,并创建一个新的用坦克的新状态记录新的身份,或者(2)和坦克桌上的“活跃”场,并且在规格改变时仍然创建新的行,但只标记坦克的当前状态为“活动”。

有没有人对这些建议的解决方案有任何意见,或有其他想法可行?

回答

0

问题在哪里?所有相关信息都在事件记录中;或者当你创造坦克和事件之间的联系时,你没有坚持坦克信息? 。事实上,它是孤立的并不是一个问题,从事件表中删除燃料类型是造成问题的原因。

为什么要坚持信息发展有几个原因。其中之一就是历史。通过将表格连接回坦克实体很好,它会告诉你什么是当前状态。事件表显示了历史,如果“类型”是不是在坦克表类型不同..

我想我不明白的问题不够好:

是用户希望看到的所有事件,甚至如果坦克被删除?

是否会在坦克类型和坦克类型之间添加一个具有开始和结束日期的关联表来解决问题?

坚持一些坦克信息到事件有什么问题?这样你就知道事件发生时罐的状态了吗?

+0

问问自己:问题是什么,为什么是问题。如果你这样做了几次,你很可能会明白为什么设计是原来的样子,否则你会发现你真正的问题。 – xQbert

+0

我专注于应用程序的其他部分一段时间后,又回到了这个问题。我确实在事件中保留了原始信息 - 我只是想方设法避免在事件表上进行文本搜索,并将其推入坦克表的索引列。 – vanjwilson

+0

我想我最终会在坦克表中添加一个活动标志,以查找作为管理功能的非活动(退役)坦克的历史记录。 – vanjwilson

1

添加坦克不应该是一个问题,但如果一个被删除,那些记录的事件将是“孤儿”。更糟糕的是,如果燃料的类型是 发生了变化,从“jet”到“rocket”,那么当有人通过历史搜索 时,他们会认为所有这些旧事件发生在 “火箭”燃料,事实上他们发生了到“喷气式”燃料。

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