Database-Design
適合 IoT 設備群的 NoSQL DB 設計
這是我的案例:
- 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
即時創建。最終的
確定設置後,您必須做三件事:
- 基準
- 基準
- 基準
沒有它,您將不知道系統的真正限制是什麼,並且您將不知道對系統的更改是否改進/惡化了設計。