繁体   English   中英

传感器数据的数据库设计(大量数据)

[英]DB design for sensor data (lots and LOTS of data)

我正在编写一个用于查看和管理传感器数据的应用程序。 我可以拥有无​​限数量的传感器,每个传感器每分钟读取一次并将值记录为(时间、值、sensor_id、location_id、[一堆其他双打])。

例如,我可能有 1000 个传感器,每分钟为每个传感器收集数据,一年后最终生成 525,600,000 行。 多个用户(最多 20 个)可以绘制任何时间段的数据,在任何范围内放大和缩小,并一次为传感器的数据添加注释。 用户还可以修改某些数据点,我需要跟踪原始数据和修改后的数据。

我不确定像这样的应用程序的数据库应该是什么样子! 它应该只是一个表 SensorData,带有时间和 sensor_id 和 location_id 的索引吗? 我应该根据 sensor_id 对这个单表进行分区吗? 我应该每天将每个传感器的数据保存在文件中(比如 .csv 文件)并根据要求将它们加载到临时表中吗? 我应该如何管理注释?

我还没有决定使用 DBMS(可能是 MySQL 或 PostgreSQL)。 但我的目的是深入了解此类应用程序中的数据管理。

我假设用户不能更改您显示的字段(时间、值、sensor_id、location_id)但其他字段隐含。

在那种情况下,我会建议版本范式。 您命名的字段是静态的,也就是说,一旦输入,它们就永远不会改变。 但是,许多用户可以更改其他字段。

您无法说明用户是看到所有用户的更改还是仅查看他们自己的更改。 我将假设所有用户都可以看到所有更改。 如果该假设是错误的,您应该能够进行适当的更改。

首先,让我们解释一下版本范式。 正如您将看到的,它只是第二范式的一个特例。

取一个您命名的字段的元组,重新排列以将键值组合在一起:

R1( sensor_id(k), time(k), location_id, value )

如您所见,location_id(假设传感器是可移动的)和值取决于生成值的传感器和进行测量的时间。 这个元组在 2nf 中。

现在您要添加可更新的字段:

R2( sensor_id(k), time(k), location_id, value, user_id, date_updated, ... )

但是可更新字段(包含在省略号中)不仅取决于原始关键字段,还取决于 user_id 和 date_updated。 元组不再在 2nf 中。

所以我们不将新字段添加到原始元组中,而是创建一个规范化的元组:

R1( sensor_id(k), time(k), location_id, value )
Rv( sensor_id(k), time(k), user_id(k), date_updated(k), ... )

这使得每个原始读物都有一系列任意数量的版本成为可能。

要查询特定读数的最新更新:

select  R1.sensor_id, R1.time, R1.location_id, R1.value, R2.user_id, R2.date_updated, R2.[...]
from    R1
left join Rv as R2
    on  R2.sensor_id = R1.sensor_id
    and R2.time = R1.time
    and R2.date_updated =(
        select max( date_update )
        from    Rv
        where   sensor_id = R2.sensor_id
            and time = R2.time )
where   R1.sensor_id = :ThisSensor
    and R1.time = :ThisTime;

要查询特定用户进行的特定阅读的最新更新,只需将 user_id 值添加到主查询和子查询的过滤条件中即可。 应该很容易看到如何获取特定读数的所有更新或仅由特定用户进行的更新。

这种设计在您如何访问数据方面非常灵活,并且由于关键字段也被索引,即使在非常大的表上也非常快。

寻找答案我遇到了这个线程。 虽然它与我的情况不完全相同,但它回答了我的许多问题; 例如使用关系数据库是一种合理的方法(答案是“是”),以及如何处理分区、维护、归档等。

https://dba.stackexchange.com/questions/13882/database-redesign-opportunity-what-table-design-to-use-for-this-sensor-data-col

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM