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

标签 database database-design large-data

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

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

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

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

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

关于database - 传感器数据的数据库设计(大量数据),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32526421/

相关文章:

mysql - mariadb 中的事件时间表

mysql - 我想一直将 mysql 数据库从远程 PC 同步到本地 PC。

php - 如何在 MySQL/PHP 中处理用户数据,用于大量用户和数据条目

hash - 如何计算 1 TB 及以上文件的哈希值?

database - 只从数据库中选择一些行

database - 是否每个开发人员一个数据库?

database - 标准化表 6

sql - 在 SQL 中使用可变模式持久化复杂类型的最有效方法

php - 如何在不更改 max_allowed_pa​​cket 的情况下将大数据插入 MySQL 数据库

unix - 使用awk提取具有多个名称的列数据(UNIX)