【问题标题】:Best way to store real world "events" in a DB?在数据库中存储真实世界“事件”的最佳方式?
【发布时间】:2023-03-18 15:36:01
【问题描述】:

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

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

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

但是,在我看来,它需要大量的后处理,例如回答上面的示例问题。我认为仅使用 SQL 无法提取这种答案。

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

谢谢。

【问题讨论】:

    标签: sql database performance data-mining


    【解决方案1】:

    您可以存储加热器开启的时间,而不是离散的开/关事件。使用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;
    

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

    总结总时间:

    select sum(time_off - time_on) from heater_usage;
    

    【讨论】:

    • 伟大的建议,微不足道的。谢谢!
    【解决方案2】:

    我认为您提供的信息不足以提出设计建议。

    我确信您存储的不仅仅是一种事件类型;是很少,还是很大。

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

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

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

    也就是说,您实际上有两种主要的设计可能性:

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

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

    【讨论】:

    • 系统建成后根本不会改变(这是一个工业过程,如果之前没有被丢弃和更换,未来 15-30 年将保持不变)。必须跟踪约 30 个不同的事件。其中 20 个只是开/关的东西,比如加热器。其他的要么是“启用运行模式 lambda”(在外部已知列表中),要么是自上次样本以来的增量。例如“自上次样品以来生产了 2.4m”或“自上次样品以来使用了 167 毫升胶水 Foo”。这两种其他类型的事件需要相同类型的数据处理,例如“本周使用了多少 Foo 类型的胶水?”。
    猜你喜欢
    • 1970-01-01
    • 2011-04-11
    • 2021-12-04
    • 1970-01-01
    • 2012-07-27
    • 1970-01-01
    • 1970-01-01
    • 2018-03-16
    • 2021-07-18
    相关资源
    最近更新 更多