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

DB design for sensor data (lots and LOTS of data)

我正在编写一个用于查看和管理传感器数据的应用程序。我可以有无限数量的传感器,每个传感器每分钟读取一次并将值记录为 (time, value, sensor_id, location_id, [a bunch of other doubles] ).

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

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

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

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

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

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

首先,让我们解释一下Version Normal Form。正如你将看到的,它只是第二范式的一个特例。

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

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值添加到主查询和子查询的过滤条件中。应该很容易看出如何获取特定阅读的所有更新或特定用户所做的更新。

这种设计在您访问数据的方式上非常灵活,而且因为关键字段也被索引,所以即使在非常大的表上也非常快。

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

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