postimage

Największe korzyści z używania odpowiedniego wzorca grupowania danych, czyli Bucket Pattern w MongoDB, to m.in. zwiększenie wydajności indeksów czy uproszczenie zapytań. Przeczytaj jak to wszystko zrealizować.

Jaki problem próbujemy rozwiązać?

Zacznijmy od prostego przykładu - pomiarów czujnika wykonywanych bardzo często, np. co sekundę, każdego dnia. Można by je zapisywać następująco:

{
   sensor_id: 12345,
   timestamp: ISODate("2019-01-31T10:00:00.000Z"),
   temperature: 40
}
 
{
   sensor_id: 12345,
   timestamp: ISODate("2019-01-31T10:01:00.000Z"),
   temperature: 40
}
 
{
   sensor_id: 12345,
   timestamp: ISODate("2019-01-31T10:02:00.000Z"),
   temperature: 41
}

Oczywiste jest, że dokumentów w takiej kolekcji będzie bardzo dużo i w związku z tym, problemem może być szybki dostęp do tych danych. W celu zwiększenia wydajności zdecydujemy się zastosować indeksy, najprawdopodobniej na polach sensor_id i timestamp. Wówczas sam rozmiar indeksów stanie się sporym wyzwaniem w kontekście niezbędnej do tego pamięci.

Na czym polega Bucket Pattern?

Wzorzec polega na odpowiednim pogrupowaniu danych. Pamiętając o naszym przykładzie z czujnikami, możemy pogrupować dane z jednego czujnika w interesującym nas przedziałach czasu, np. przedziałach 1-godzinnych. Przejdziemy wówczas z modelu danych odpowiadającemu relacyjnemu podejściu na model z zagnieżdżonymi dokumentami.

Te same dane wyglądałyby następująco:

{
    sensor_id: 12345,
    start_date: ISODate("2019-01-31T10:00:00.000Z"),
    end_date: ISODate("2019-01-31T10:59:59.000Z"),
    measurements: [
       {
       timestamp: ISODate("2019-01-31T10:00:00.000Z"),
       temperature: 40
       },
       {
       timestamp: ISODate("2019-01-31T10:01:00.000Z"),
       temperature: 40
       },
       ...
       {
       timestamp: ISODate("2019-01-31T10:42:00.000Z"),
       temperature: 42
       }
    ],
   transaction_count: 42,
   sum_temperature: 2413
}

Dokumentów w kolekcji będzie mniej i zwiększymy wydajność zapytań. Wiedząc, jakie będzie zastosowanie danych, możemy również dodać do naszego “wiaderka” dodatkowe informacje. Czy faktycznie potrzebujemy do większości zapytań każdego pojedynczego pomiaru? Być może ciekawszą informacją będzie średnia temperatura z godziny w danym miejscu? Wówczas możemy zapisać takie zagregowane dane w Bucket Pattern i uprościć późniejsze zapytania.

W naszym przykładzie, jeśli dojdzie nowy pomiar z czujnika w tym zakresie, zwiększymy liczbę transaction_count i sum_temperature. Zapytanie o średnią temperaturę w danym dniu lub godzinie, będzie wtedy nawet prostsze niż gdybyśmy korzystali z pojedynczych pomiarów.

I na koniec jeszcze jedna wskazówka. Dobrym pomysłem może się okazać zarchiwizowanie części danych historycznych. Dane spływają wówczas na bieżąco i wiemy, że konkretny dokument nie będzie później modyfikowany, a dostęp do starych danych może być niezwykle rzadki.

Praktyczne przypadki użycia

Twórcy Mongo chwalą się, że takie zastosowania to nie tylko teoria. Bosch korzysta z Bucket Pattern w MongoDB w aplikacji z branży automotive, zbierając dane z wielu czujników w pojeździe. Również niektóre banki skorzystały z tego wzorca, grupując transakcje.

Korzyści, o których warto pamiętać

  • redukcja liczby dokumentów w kolekcji,
  • zwiększenie wydajności indeksów,
  • uproszczenie zapytań dotyczących zagregowanych danych.

Przeczytaj więcej tutaj:

💡 "Czy wiesz, że?" to wewnątrzfirmowa inicjatywa, której celem jest szerzenie ciekawostek z różnych obszarów IT. Najlepsze z nich trafiają na bloga dla szerszego grona odbiorców.