[英]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 值添加到主查詢和子查詢的過濾條件中即可。 應該很容易看到如何獲取特定讀數的所有更新或僅由特定用戶進行的更新。
這種設計在您如何訪問數據方面非常靈活,並且由於關鍵字段也被索引,即使在非常大的表上也非常快。
尋找答案我遇到了這個線程。 雖然它與我的情況不完全相同,但它回答了我的許多問題; 例如使用關系數據庫是一種合理的方法(答案是“是”),以及如何處理分區、維護、歸檔等。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.