Saya telah ditugaskan untuk mengimplementasikan solusi (aplikasi dan db) untuk menyimpan sampel data dari array sensor yang sangat besar. Array saat ini terdiri dari sekitar 20.000 sensor, tetapi itu akan segera tumbuh, hingga 100.000 sensor. Setiap sensor mengirimkan sampel data setiap 10 detik dan setiap sampel berukuran 28 byte.
Dengan demikian, jumlah yang terjadi mengarah ke:
- 8640 sampel per sensor per hari
- 242kB data per sensor per hari
- 864 juta sampel per hari
Sekarang saya bertanya-tanya apa cara terbaik untuk menyimpan / mengambil data? Saya "bergabung" dengan proyek ini setelah perangkat lunak telah ditentukan, sehingga perlu diimplementasikan pada Platform Windows menggunakan SQL Server.
Solusi saat ini di kepala saya adalah membuat DB dengan dua tabel untuk menyimpan sampel data. Yang pertama berfungsi sebagai semacam indeks ke dalam indeks kedua yang menyimpan sampel yang dikumpulkan dalam bidang biner per hari per basis sensor:
Table 1:
RecordID - BigInt - Identity
SensorID - BigInt - Primary Key
Date - DateTime - Primary Key (yyyy-mm-dd)
Table 2:
RecordID - BigInt - Primary Key (from an insert into Table 1)
Data - Binary
Pada dasarnya saya akan menulis sampel dari semua sensor menjadi file sementara (1 per sensor). Pada akhir setiap hari saya kemudian akan membuat entri di Tabel 1, menggunakan RecordID yang dihasilkan dan membuang file ke bidang Data di Tabel 2.
Dengan cara ini saya berakhir dengan hanya 100.000 entri ke dalam tabel per hari, bukan 864 juta entri. Data tersebut harus tersedia pada LAN atau WAN Kecepatan Tinggi, sehingga pengambilan data sensor setiap hari akan dapat diterima.
Meskipun semua data harus disimpan, sebagian besar mungkin tidak akan pernah dibaca. Jadi jumlah bacaan di atas meja tidak akan lebih banyak dari pada yang ditulis.
Saya tahu bahwa saya bisa mengimplementasikan sesuatu menggunakan sistem file dengan hanya menyimpan path ke file data, tetapi saya membaca bahwa SQL Server mengungguli NTFS sementara bidang biner Anda kurang berterima 256kB. (Area abu-abu ada antara 256kB dan 1MB, sementara NTFS jauh mengungguli SQL Server untuk ukuran biner> 1 MB).
Saya juga sedikit waspada menyimpan data dari 100.000 sensor ke dalam file mereka sendiri tanpa menyebabkan masalah dalam sistem file dengan baik memiliki sejumlah besar file dalam folder, atau dengan memiliki struktur pohon yang kompleks dengan beberapa file di setiap folder, sementara tidak bahkan memperhitungkan fragmentasi file.
Adakah yang bisa memberi saya saran / komentar praktis di atas?
Apakah ada jebakan jelas yang akan saya hadapi?
Data sampel melakukan kompres dengan cukup baik. File 242 kB memampatkan menjadi sekitar 85kB. Namun, bisakah saya menerapkan beberapa jenis kompresi pada tingkat basis data sehingga data sampel (kolom) dikompresi secara otomatis?
Apakah SQL Server merupakan pilihan yang jelas salah untuk proyek ini?
Apakah desain saya dari dua tabel bijaksana, atau bisakah saya menggabungkannya menjadi satu tabel yang masih akan sama "performan" dengan dua tabel?