NoSQL a inne ustawienia SQL Drupal

14

Jakie są zalety uruchamiania NoSQL (wcześniej MongoDB) nad MySQL, PostGRE SQL lub MSSQL w Drupal? Czy korzyści płynące z prostego korzystania z magazynu, czy też niektóre konfiguracje Drupala wymagają zmiany?

Kevin
źródło
Jest to pytanie, na które Károly Négyesi udzieliłby „autorytatywnej” odpowiedzi. Z pewnością zna zalety korzystania z MongoDB z Drupalem.
kiamlaluno
Przeczytaj moje zdanie .. bardzo zainteresowany innymi opcjami, jeśli istnieją znaczne korzyści, i oczywiście plusy mają wady.
Kevin

Odpowiedzi:

13

MongoDB może służyć do przechowywania większości lub wszystkich jednostek w szybkim, zorientowanym na dokumenty magazynie. Ten typ magazynu skaluje się znacznie lepiej niż standardowy magazyn oparty na SQL, który mamy w rdzeniu Drupala (który jest oparty na schemacie „jedna tabela na pole”).

W obecnym stanie Drupala 7 masz:

  • Tabela podstawowa encji przechowywana w SQL (tj. Tabela użytkowników, tabela węzłów itp.)
  • Wszystkie pola przechowywane w SQL
  • Właściwości encji z ich tabel podstawowych zduplikowanych w MongoDB

Umożliwia to szybkie odpytywanie o jednostki na MongoDB i możliwość dodawania złożonych indeksów, które nie obsługują bazy danych SQL opensource (w tym indeksów między tabelami). Jednocześnie nie tracisz interoperacyjności, ponieważ tabela podstawowa encji jest nadal przechowywana w języku SQL, a zatem można do niej dołączyć moduły, które są nadal tylko SQL (jak flaga).

Ten rodzaj szybkiego zapytania jest dostępny dzięki mechanizmowi EntityFieldQuery, który jest sposobem na tworzenie zapytań dotyczących encji, ich właściwości i pól w sposób abstrakcyjny. Domyślna implementacja w rdzeniu tłumaczy te zapytania na SQL, ale moduł MongoDB ma w pełni funkcjonalną implementację, która może bezpośrednio zaspokoić te zapytania z MongoDB.

Dzięki backendowi EntityFieldQuery dla widoków możesz łatwo wykorzystać tę moc, korzystając z narzędzi, do których jesteś przyzwyczajony. Jedynym minusem jest to, że relacje nie są obsługiwane (ale w praktyce i tak rzadko są one potrzebne - i można to obejść, wpychając dodatkowe dane do obiektu encji i dodając ujawnianie ich jako dodatkowych właściwości encji).

W skrócie, gdy tylko wydajność zapytania stanowi problem w twoim projekcie, co dzieje się, gdy masz znaczący zestaw danych (powiedzmy, że zaczynając od kilku dziesiątych tysięcy jednostek dla danego typu jednostki), MongoDB jest zyskiem netto dla bardzo niewielu wad. Wysoce polecany.

Damien Tournoud
źródło
Damien Tournoud: Jeśli występują problemy z wydajnością z zaledwie kilkoma dziesiątymi tysiącami wpisów, prawdopodobnie istnieje problem z podkładem (konfiguracja DBMS, źle napisane zapytania, może to być cokolwiek). Jeśli podkładowy schemat SQL jest wystarczająco dobry, nie powinieneś się martwić przed milionem wpisów w jednej tabeli (ale pola mogą szybko rosnąć, jeśli weźmiesz pod uwagę poprawki i pola o wielu wartościach).
Pierre
Chodzi mi dokładnie o to: nasz schemat jest znormalizowany, co w konsekwencji ma bardzo niską wydajność zapytań. Aby poprawić wydajność zapytań, należy denormalizować schemat. Główną zaletą korzystania z MongoDB w naszym przypadku jest to, że jest to pewnego rodzaju „automatyczny silnik do denormalizacji”.
Damien Tournoud,
I oczywiście MongoDB jest tutaj świetny, ponieważ jest bazą danych zorientowaną na dokumenty. Przechowywanie złożonych dokumentów, takich jak encje w pamięci SQL, jest po prostu głupie. To jest nasza domyślna implementacja, ale to nie znaczy, że powinieneś jej używać :)
Damien Tournoud,
@Pierre: Damien mówił o kilku dziesięciu tysiącach bytów , które mogą być czymś zupełnie innym niż wiersze tabeli. Na przykład, możesz mieć 10 lub więcej pól na tej encji, a następnie masz 10 dodatkowych tabel, które wymagają zapytania za pomocą osobnego zapytania za każdym razem, gdy taka encja jest ładowana. MongoDB może zastąpić te dodatkowe tabele, a nie tabelę podstawową encji.
Berdir
2
Żaden moduł nie powinien oczekiwać, że pola będą w MySQL. Jedynym sposobem zapytania o pola na Drupal 7 jest EntityFieldQuery. Otwórz błąd w module, jeśli bezpośrednio przeszukuje tabele pól. Obecnie nie znam żadnego z tych modułów.
Damien Tournoud,
7

MongoDB i podobne są zaprojektowane do przechowywania uporządkowanych (hierarchicznych) danych w stosunkowo elastyczny sposób.

Na przykład w Drupal 7trakcie używania field_sql_storagekażde pole otrzymuje własne tabele. Po dołączeniu 10 pól do typu zawartości powstaje 10 tabel w bazie danych. Po załadowaniu tego węzła field_sql_storagewykona zapytanie dla pola i dla węzła (lub wielu węzłów, jeśli są używane node_load_multiple).

Korzystając z mongodb_field_storage , możesz przechowywać wszystkie pola węzła w jednym dokumencie i uzyskiwać je za pomocą jednego zapytania.

Możesz także przechowywać inne rzeczy, takie jak watchdog, sesje, pamięć podręczna, bloki w MongoDB .

Nadal potrzebujesz MySQL, MongoDB go nie zastępuje (tylko w przypadku niektórych części).

Kolejną zaletą jest to, że dzięki MongoDB łatwiej jest skalować, można dodać wiele serwerów do klastra i udostępniać dane między nimi.

Berdir
źródło
Cześć Berdir! Czy wiesz, że jeśli upuszczę MongoDB w istniejącym proyectie w celu przetestowania wydajności, czy włączę i wyłączę moduł bez konsekwencji? Chcę spróbować mongo, ale co, jeśli to nie zadziała czy coś? Czy można bezpiecznie spróbować? (Wiem, że nie możesz tego zagwarantować, ale zastanawiam się, co dzieje się w większości przypadków)
Beto Aveiga
1
Cóż, na początek nie możesz go po prostu upuścić. Każde pole skonfigurowało, którego zaplecza pamięci używa, będziesz musiał zmienić / ponownie utworzyć swoje pola, ponownie utworzyć swoje widoki (ponieważ muszą używać backendu efq_views ), może twoje własne zapytania, jeśli napisałeś bezpośrednie zapytania do tabel danych pól. Może być łatwiej odtworzyć tę samą strukturę w nowej instalacji w celu wstępnego porównania.
Berdir
Dzięki Berdir! Próbowałem MongoDB kilka dni temu, ale nie było zauważalnego wzrostu wydajności, ale także nie byłem świadomy rzeczy / zmian, które mi teraz mówisz. Pomyślałem, że „MongoDB powinien coś zmienić w większych witrynach”. Spróbuję ponownie MongoDB.
Beto Aveiga,
5

Profesjonaliści przychodzą z wadami.

Drupal jako całość nie może zostać przełączony na MongoDb, więc będziesz musiał obsługiwać dwie bazy danych i upewnić się, że działają one dobrze razem.

Wiele modułów nie będzie mogło współpracować z mongodb, więc stracisz interoperacyjność.

Chyba że masz pilną potrzebę (jak część twojego systemu nie radzi sobie z liczbą żądań / lub ilością danych) nie zmieniłbym. I nawet kiedy zaczynasz zbliżać się do granic, spójrz na rzucanie sprzętem na problem lub strojenie przed przełączeniem.

Myślałem, że już na to odpowiedziałem, na SO jest prawie duplikat

Jeremy French
źródło