sql - 在数据库中存储现实世界 "events"的最佳方式?

标签 sql database performance data-mining

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

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

我想到的是创建一个表,每次发生状态更改时我都会在其中插入一行,包括时间戳。

但是,在我看来,这将需要相当多的后处理,例如回答上面的示例问题。我认为无法仅使用 SQL 提取此类答案。

问题:有没有比我在这里描述的更适合、更有效的“存储模式”?

谢谢。

最佳答案

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

当加热器打开时:

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

当加热器关闭时:

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

使用唯一约束来确保没有两行对于 time_off 可以有 null,作为基本检查以确保您不会留下没有 time_off 如果您的脚本未正确调用。您可以在打开加热器时检查它们,然后将其移除。

总结总时间:

select sum(time_off - time_on) from heater_usage;

关于sql - 在数据库中存储现实世界 "events"的最佳方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5016896/

相关文章:

php - 记录每行对 MySQL 表行的命中

mysql - 如何在 Go 中构建类型接口(interface)的变量?

java - 搜索策略以有效地从服务或服务器加载数据?

mysql - 如何在单个表之间创建关系?

java - post 方法不适用于 postman (chrome 扩展)

c# - 为什么将 High chance 子句放在嵌套 If else 的前面会降低性能?

python - 进行 BFS 时避免深度复制

java - 钻取错误 : UNSUPPORTED_OPERATION ERROR: Only COUNT, VarChar 类型支持的 MIN 和 MAX 聚合函数

sql - 在 SQL Server 中通过标准差消除异常值

java - 从hibernate中的多个表中检索数据