Przekład artykułu przygotowany przed rozpoczęciem kursu .

Najważniejsze punkty:
- Niezwykle istotne jest opracowanie schematu, mimo że w MongoDB jest on opcjonalny.
- Podobnie, indeksy muszą odpowiadać twojemu schematowi i wzorcom dostępu.
- Unikaj używania dużych obiektów i dużych tablic.
- Zachowaj ostrożność z ustawieniami MongoDB, szczególnie jeśli chodzi o bezpieczeństwo i niezawodność.
- W MongoDB nie ma optymalizatora zapytań, więc musisz być ostrożny przy wykonywaniu operacji zapytań.
Pracuję z bazami danych od bardzo długiego czasu, ale dopiero niedawno odkryłem MongoDB. Jest kilka rzeczy, które chciałbym wiedzieć przed rozpoczęciem pracy z nią. Kiedy ktoś ma już doświadczenie w danej dziedzinie, ma swoje wcześniejsze wyobrażenia o tym, czym są bazy danych i co robią. Aby ułatwić zrozumienie innym ludziom, przedstawiam listę powszechnych błędów.
Utworzenie serwera MongoDB bez uwierzytelniania
Niestety, MongoDB domyślnie jest instalowana bez uwierzytelniania. Dla stacji roboczej, do której dostęp uzyskuje się lokalnie, taka praktyka jest w porządku. Ale ponieważ MongoDB jest systemem wielodostępnym, który lubi korzystać z dużych ilości pamięci, lepiej byłoby, gdybyś zainstalował ją na serwerze z maksymalną ilością pamięci RAM, jaką możesz mieć w tych warunkach, nawet jeśli zamierzasz używać jej tylko do rozwoju. Instalacja na serwerze przez domyślny port może być problematyczna, szczególnie, jeśli w zapytaniu można wykonać dowolny kod JavaScript (np. $where jako pomysł na ).
Istnieje kilka metod uwierzytelniania, ale najłatwiej jest ustawić ID/hasło dla użytkownika. Skorzystaj z tego pomysłu, podczas gdy myślisz o fantazyjnej uwierzytelnianiu opartej na . Jeśli mówimy o bezpieczeństwie, to MongoDB powinna być stale aktualizowana, a logi zawsze należy sprawdzać pod kątem nieautoryzowanego dostępu. Na przykład, lubię wybierać inny port jako port domyślny.
Nie zapomnij powiązać powierzchni ataku z MongoDB
zawiera dobre porady dotyczące zmniejszenia ryzyka nieautoryzowanego dostępu do sieci i wycieku danych. Łatwo jest zlekceważyć i powiedzieć, że serwer deweloperski nie wymaga wysokiego poziomu bezpieczeństwa. Jednak sprawy nie są takie proste i odnosi się to do wszystkich serwerów MongoDB. W szczególności, jeśli nie ma przekonującego powodu do użycia , lub , należy wyłączyć możliwość uruchamiania dowolnego kodu w JavaScript, zmieniając plik konfiguracyjny . Ponieważ w standardowej MongoDB pliki danych nie są szyfrowane, rozsądnie jest uruchamiać MongoDB z , który ma pełny dostęp do plików, z ograniczonym dostępem tylko dla niego oraz możliwością korzystania z własnych narzędzi zarządzania dostępem do plików systemu operacyjnego.
Błąd w projektowaniu schematu
MongoDB nie korzysta z schematu. Ale to nie znaczy, że schemat jest zbędny. Jeśli chcesz po prostu przechowywać dokumenty bez jakiegokolwiek zharmonizowanego schematu, można je szybko i łatwo przechować, ale ich późniejsze wydobycie może być .
Klasyczny artykuł „ wart jest przeczytania, a takie funkcje jak w zewnętrznym narzędziu Studio 3T są warte wykorzystania do regularnych kontroli schematów.
Nie zapomnij o porządku sortowania
Zapominając o porządku sortowania, można doświadczyć największego rozczarowania i stracić więcej czasu niż przy użyciu jakiejkolwiek innej błędnej konfiguracji. Domyślnie MongoBD używa . Ale mało kto uzna to za użyteczne. Wrażliwe na wielkość liter i akcentowanie, sortowanie binarne uważało się za ciekawy anachronizm, podobnie jak koralików, kaftany i kręcone wąsy jeszcze w latach 80. XX wieku. Teraz ich użycie jest nie do przyjęcia. W rzeczywistości „motocykl” to to samo, co „Motocykl”. A „Wielka Brytania” i „wielka brytania” to to samo miejsce. Mała litera to po prostu wielka litera w równoważnej formie. I nie zmuszaj mnie, bym mówił o sortowaniu znaków diakrytycznych. Przy tworzeniu bazy danych w MongoDB używaj parametrów sortowania, które nie uwzględniają akcentów i , które odpowiadają językowi i . W ten sposób znacząco uprościsz wyszukiwanie w danych tekstowych.
Tworzenie kolekcji z dużymi dokumentami
MongoDB umożliwia przechowywanie dużych dokumentów o rozmiarze do 16 MB w kolekcjach, a jest przeznaczone do dużych dokumentów o rozmiarze przekraczającym 16 MB. Jednak tylko dlatego, że można tam przechowywać duże dokumenty, nie jest to najlepszy pomysł. Najlepiej MongoDB działa, gdy przechowujesz pojedyncze dokumenty o rozmiarze kilku kilobajtów, traktując je bardziej jak wiersze w szerokiej tabeli SQL. Duże dokumenty będą źródłem problemów z .
Tworzenie dokumentów z dużymi tablicami
Dokumenty mogą zawierać tablice. Najlepiej, jeśli liczba elementów w tablicy jest znacznie mniejsza niż cztery cyfry. Jeśli elementy są często dodawane do tablicy, przekroczy ona zawierający ją dokument i będzie trzeba ją , co oznacza, że trzeba będzie . Podczas ponownej indeksacji dokumentu z dużą tablicą, indeksy często będą nadpisywane, ponieważ dla każdego elementu istnieje , przechowujący jego indeks. Taka ponowna indeksacja występuje również, gdy dokument jest dodawany lub usuwany.
W MongoDB istnieje tzw. , który zapewnia przestrzeń na rozwój dokumentów, aby zminimalizować ten problem.
Możesz pomyśleć, że można obejść się bez indeksacji tablic. Niestety, z powodu braku indeksów mogą pojawić się inne problemy. Ponieważ dokumenty są przeszukiwane od początku do końca, wyszukiwanie elementów na końcu tablicy zajmie więcej czasu, a większość operacji związanych z takim dokumentem będzie .
Nie zapomnij, że kolejność etapów w agregacji ma znaczenie
W systemie baz danych z optymalizatorem zapytań, zapytania, które piszesz, są wyjaśnieniami tego, co chcesz uzyskać, a nie tym, jak to osiągnąć. Taki mechanizm działa na podobieństwo zamówienia w restauracji: zwykle po prostu zamawiasz danie, a nie dajesz szczegółowych instrukcji kucharzowi.
W MongoDB instruujesz kucharza. Na przykład, musisz upewnić się, że dane przechodzą przez reduce jak najszybciej w pipeline za pomocą $match i $project, a sortowanie odbywa się dopiero po reduce, i że wyszukiwanie odbywa się dokładnie w tym porządku, w jakim potrzebujesz. Posiadanie optymalizatora zapytań, który eliminuje zbędną pracę, optymalnie porządkuje etapy i wybiera typ połączenia, może Cię rozpieścić. W MongoDB masz większą kontrolę nad ceną wygody.
Takie narzędzia jak ułatwią tworzenie zapytań agregacyjnych w . Funkcja Aggregation Editor pozwoli Ci stosować operatory potoków jeden etap za razem oraz sprawdzać dane wejściowe i wyjściowe na każdym etapie dla ułatwienia debugowania.
Używanie szybkiej rejestracji
Nigdy nie ustawiaj w MongoDB parametrów rejestracji z wysoką prędkością, ale niską niezawodnością. Ten tryb «file-and-forget» wydaje się szybki, ponieważ polecenie zwraca się przed zapisaniem. Jeśli system zawiedzie przed zapisaniem danych na dysku, zostaną one utracone i znajdą się w niespójnym stanie. Na szczęście w 64-bitowym MongoDB włączone jest dziennikowanie.
Silniki przechowywania MMAPv1 i WiredTiger używają dziennikowania, aby temu zapobiec, chociaż WiredTiger może przywrócić się do ostatniego spójnego , jeśli dziennikowanie jest wyłączone.
Dziennikowanie zapewnia, że baza danych znajduje się w spójnym stanie po przywróceniu i przechowuje wszystkie dane do momentu zapisu w dzienniku. Częstotliwość zapisów jest konfigurowana za pomocą parametru .
Aby mieć pewność co do zapisów, upewnij się, że w pliku konfiguracyjnym dziennikowanie jest włączone ), a częstotliwość zapisów odpowiada ilości informacji, którą możesz sobie pozwolić stracić.
Sortowanie bez indeksu
Podczas wyszukiwania i agregacji często zachodzi potrzeba sortowania danych. Miejmy nadzieję, że dzieje się to na jednym z ostatnich etapów, po filtrowaniu wyników w celu zmniejszenia objętości sortowanych danych. I nawet w takim przypadku do sortowania potrzebny będzie . Można użyć indeksu pojedynczego lub złożonego.
Jeśli odpowiedniego indeksu nie ma, MongoDB poradzi sobie bez niego. Istnieje ograniczenie pamięci wynoszące 32 MB na całkowity rozmiar wszystkich dokumentów w , a jeśli MongoDB osiągnie ten limit, to wyda błąd lub zwróci .
Wyszukiwanie bez wsparcia indeksów
Zapytania wyszukiwania pełnią funkcję podobną do operacji JOIN w SQL. Aby działały lepiej, potrzebują indeksu wartości klucza używanego jako klucz obcy. To nie jest oczywiste, ponieważ użycie nie jest odzwierciedlone w explain(). Takie indeksy są uzupełnieniem indeksu zapisanego w explain(), który z kolei jest używany przez operatorów pipeline $match i $sort, gdy pojawiają się na początku pipeline. Indeksy mogą teraz obejmować dowolny etap .
Rezygnacja z wielokrotnych aktualizacji
Metoda jest używana do zmiany części istniejącego dokumentu lub całego dokumentu, aż do pełnej wymiany, w zależności od zadanego parametru . Nie jest tak oczywiste, że nie przetworzy wszystkich dokumentów w kolekcji, dopóki nie ustawisz parametru aby zaktualizować wszystkie dokumenty spełniające kryteria zapytania.
Nie zapomnij o znaczeniu kolejności kluczy w tablicy haszującej
W JSON obiekt składa się z nieuporządkowanej kolekcji zerowej lub większej par klucz/wartość, gdzie klucz to ciąg znaków, a wartość to ciąg znaków, liczba, wartość logiczna, zero, obiekt lub tablica.
Niestety, BSON przykłada dużą wagę do kolejności podczas wyszukiwania. W MongoDB kolejność kluczy wewnątrz wbudowanych obiektów , tzn. { firstname: "Phil", surname: "factor" } nie jest to samo co { { surname: "factor", firstname: "Phil" }. Oznacza to, że musisz zachować kolejność par klucz/wartość w dokumentach, jeśli chcesz mieć pewność, że je znajdziesz.
Nie myl "null" i "undefined"
Wartość "undefined" nigdy nie były dozwolone w JSON, zgodnie z JSON (ECMA-404, Rozdział 5), mimo że są używane w JavaScript. Co więcej, dla BSON zostały one uznane za przestarzałe i są przekształcane w $null, co nie zawsze jest dobrym rozwiązaniem. .
Użycie $limit() bez $sort()
Bardzo często, gdy rozwijasz aplikację w MongoDB, przydatne jest po prostu zobaczenie próbki wyniku, który zostanie zwrócony z zapytania lub agregacji. Do tego zadania przyda ci się $limit(), ale nigdy nie powinno go być w finalnej wersji kodu, chyba że przed nim używasz $sort. Ta mechanika jest potrzebna, ponieważ w przeciwnym razie nie możesz zagwarantować kolejności wyników i nie będziesz mógł niezawodnie przeglądać danych. Na górze wyników będziesz otrzymywał różne wpisy w zależności od sortowania. Aby działać niezawodnie, zapytania i agregacje muszą być deterministyczne, to znaczy muszą zwracać te same wyniki przy każdym wykonaniu. Kod, w którym są $limit(), ale nie ma $sort, nie będzie deterministyczny i w przyszłości może spowodować błędy, które będą trudne do zidentyfikowania.
Podsumowanie
Jedynym sposobem na rozczarowanie się MongoDB jest porównywanie jej bezpośrednio z innym typem baz danych, takim jak RDBMS, lub przyjście do jej używania, opierając się na jakichś określonych oczekiwaniach. To tak, jakby porównywać pomarańczę z widelcem. Systemy baz danych mają swoje cele. Najlepiej po prostu zrozumieć i docenić te różnice. Byłoby wstyd naciskać na programistów MongoDB z powodu drogi, którą zmusili ich zająć się RDBMS. Chciałbym widzieć nowe i interesujące sposoby rozwiązania starych problemów, takich jak zapewnienie integralności danych i tworzenie systemów danych odpornych na awarie i ataki cybernetyczne.
Wprowadzenie w MongoDB w wersji 4.0 transakcyjności ACID to dobry przykład wprowadzenia ważnych ulepszeń w sposób innowacyjny. Transakcje wielodokumentowe i wieloopera cyjne są teraz atomowe. Pojawiła się również możliwość regulacji czasu potrzebnego na uzyskanie blokad oraz kończenia zawieszonych transakcji, a także zmiany poziomu izolacji.
Czytaj dalej:
Źródło: habr.com
