在数据库中存储真实世界“事件”的最佳方法?

时间:2011-02-16 13:17:50

标签: sql database performance data-mining

我正在建立一个系统,该系统将收集有关外部控制的工业过程的数据。这些数据将用于构建系统各种组件的使用情况统计信息。

简化示例:有一个打开和关闭的加热器,当它发生时我会收到通知。我需要记录这个,并根据这些数据能够回答诸如“加热器上个月有多久?”之类的问题。

我想到的是创建一个表,每次状态发生变化时我都插入一行,包括一个时间戳。

然而,在我看来,它需要进行大量的后处理,例如回答上面的示例问题。我认为没有办法只用SQL提取这种答案。

问题:我在这里描述的是否有更适合,更有效的“存储模式”?

感谢。

2 个答案:

答案 0 :(得分:4)

您可以存储加热器开启的时间,而不是离散的开/关事件。使用time_ontime_off列分别跟踪加热器的开启和关闭时间,然后从time_on中减去time_off以获取持续时间。

打开加热器时:

insert into heater_usage (time_on, time_off) values (now(), null);

加热器关闭时:

update heater_usage set time_off = now() where time_off is null;

使用唯一约束来确保null没有两行可以time_off作为基本检查,以确保您不会留下没有time_off的“悬空”记录脚本未正确调用。您可以检查加热器打开时的情况,然后将其移除。

总计总时间:

select sum(time_off - time_on) from heater_usage;

答案 1 :(得分:0)

我认为您没有提供足够的信息来提出设计。

我确信您存储的不仅仅是一种事件类型;它是少数,还是非常大的数量。

每种事件类型需要存储的数据有何不同?

这个系统需要多久更换一次?您是否需要定期或很少编辑或添加事件类型?

这是一个必须灵活处理事件产生的数据类型的系统吗?

说,你实际上有两种主要的设计可能性:

为显式捕获事件类型数据的每个事件类型创建一个唯一表,或者创建有限数量的表,这些表可以存储包含xml列的多个事件类型的数据,或者某种形式的序列化数据。

第一个不太灵活,第二个需要更多的后期处理。