Zadanie polegało na wdrożeniu rozwiązania (aplikacji i bazy danych) do przechowywania próbek danych z ogromnej matrycy czujników. Tablica składa się obecnie z około 20 000 czujników, ale wkrótce będzie rosnąć, do 100 000 czujników. Każdy czujnik wysyła próbkę danych co 10 sekund, a każda próbka ma rozmiar 28 bajtów.
Wykonywanie sum prowadzi zatem do:
- 8640 próbek na czujnik dziennie
- 242kB danych na czujnik dziennie
- 864 miliony próbek dziennie
Teraz zastanawiam się, jaki byłby najlepszy sposób przechowywania / odzyskiwania danych? „Przyłączyłem się” do tego projektu po tym, jak oprogramowanie zostało już określone, dlatego należy je zaimplementować na platformie Windows za pomocą programu SQL Server.
Obecne rozwiązanie w mojej głowie polega na utworzeniu bazy danych z dwiema tabelami do przechowywania próbek danych. Pierwszy służy jako swego rodzaju indeks do drugiego, który przechowuje zebrane próbki w polu binarnym na dzień na podstawie czujnika:
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
Zasadniczo napiszę próbki ze wszystkich czujników do plików tymczasowych (1 na czujnik). Na koniec każdego dnia utworzę wpis w tabeli 1, użyj wygenerowanego identyfikatora RecordID i zrzuć plik do pola danych w tabeli 2.
W ten sposób otrzymuję tylko 100 000 wpisów dziennie, zamiast 864 milionów wpisów. Dane powinny być dostępne w sieci LAN lub High Speed WAN, więc pobieranie danych z czujników przez cały dzień byłoby dopuszczalne.
Chociaż wszystkie dane muszą być przechowywane, większość z nich prawdopodobnie nigdy nie zostanie odczytana. Tak więc ilość odczytów na stole (stołach) nie będzie znacznie większa niż liczba zapisów.
Wiem, że mogłem zaimplementować coś przy użyciu systemu plików, po prostu przechowując ścieżkę do plików danych, ale przeczytałem, że SQL Server przewyższa NTFS, podczas gdy twoje pola binarne są mniejsze dzięki 256kB. (Szary obszar istnieje od 256 kB do 1 MB, podczas gdy NTFS znacznie przewyższa SQL Servera dla rozmiarów binarnych> 1 MB).
Nieufnie też przechowuję dane ze 100 000 czujników we własnych plikach bez powodowania problemów w systemie plików, ponieważ albo mają ogromne ilości plików w folderze, albo mają złożoną strukturę drzewa z kilkoma plikami w każdym folderze, chociaż nie nawet biorąc pod uwagę fragmentację plików.
Czy ktoś może zaoferować mi praktyczne porady / komentarze na powyższe tematy?
Czy są oczywiste pułapki, w które wpadnę?
Przykładowe dane dość dobrze się kompresują. Plik 242 kB kompresuje się do około 85 kB. Czy mogę jednak wdrożyć pewien rodzaj kompresji na poziomie bazy danych, aby przykładowe dane (kolumna) były kompresowane automatycznie?
Czy SQL Server jest oczywiście złym wyborem dla tego projektu?
Czy mój projekt dwóch stołów jest mądry, czy równie dobrze mogę połączyć go w jeden stół, który nadal będzie tak „wydajny” jak dwa stoły?