Database-Design

適合 IoT 設備群的 NoSQL DB 設計

  • October 23, 2018

這是我的案例:

  • 10,000 台物聯網設備
  • 每個物聯網設備每 30 秒發送一次其環境數據(溫度、壓力等)
  • 每台設備的數據將保留 24 小時

主要要求是檢索特定設備的最新數據(來自 device_id)。數據的檢索將逐步進行。這意味著,一次只能讀取 100 條記錄。然後如果使用者想要,他會請求讀取之前的 100 條記錄,以此類推。

此外,多個使用者可能同時嘗試檢索多個設備的數據。

我的擔憂是:

  • 如何建構數據庫(我專門研究 AWS 的 DynamoDB)
  • 為每個設備創建一個表會很優雅,但似乎不建議創建 10,000 個表
  • 如果我將所有 10,000 台設備放在一張大表中,則讀取該表的效率將非常低。

有人可以就這種情況下的最佳設​​計策略提出建議嗎?

謝謝你。

為什麼選擇 NoSQL?

現代硬體上的任何 RDBMS 都可以輕鬆支持您的要求。

基本設置

這意味著與 RDBMS 無​​關。您需要將其調整為您選擇的 RDBMS。

create table iot_devices (
 device_id      int identity primary key,
 gis_location   rdbms dependent, -- yes, databases can support longitude/latitude information.
 serial#        varchar(20),
 other_data     what-ever-you-need
);

create table iot_data (
 device_id   int not null references iot_devices (device_id),
 date_time   date  not null,
 temp        number(4,1), -- make sure COMMENT if the units are Celsius, Fahrenheit, or Kelvin
 pH          number(3,1) check ( pH between -14.0 and 14.0)
 -- other data
);

恢復

現在,您的主要 SELECT 語句是這樣的:

select *
from iot_data a
where a.device_id = ?
order by a.device_id, a.date_time desc
-- syntax for limit/paging clause is RDBMS specific
;

問號是一個佔位符,以便您可以BIND取值。它還可以防止SQL 注入。需要多個設備?調查Array Binding

根據經驗,該索引應該有助於加快特定查詢:

create index iot_data_ix1 on iot_data (device_id, date_time desc);

刪除過期數據

由於需要刪除的數據量很大,刪除“舊數據”會讓人頭疼。使用PARTITIONING,您可以DROP非常快速地處理大量數據。

我建議以 1 天為間隔進行範圍分區,並每天刪除第 3 天的分區。一些 RDBMS 需要PARTITION提前創建;其他人可以PARTITION即時創建。

最終的

確定設置後,您必須做三件事:

  • 基準
  • 基準
  • 基準

沒有它,您將不知道系統的真正限制是什麼,並且您將不知道對系統的更改是否改進/惡化了設計。

引用自:https://dba.stackexchange.com/questions/220813