skąd taki szał z MongoDB

skąd taki szał z MongoDB
0

Skąd k#$%a taki szał na MongoDB? Gadam z kumplem, mówi mi, że szukają webmastera ze znajomością MongoDB. Gadam z drugim kumplem, mówi że przechodzą w jego firmie w kluczowych serwisach na MongoDB. Ktoś inny, chwali się że w poprzedniej firmie to pracowali w MongoDB. W dupach im się poprzewracało, mysql stał się nudny, czy co?

drorat1
  • Rejestracja:ponad 15 lat
  • Ostatnio:około 2 lata
  • Lokalizacja:Krasnystaw
  • Postów:1181
0

Spotkałem się ostatnio z takim serwisem opartym o Node.js, Meteor.js oraz właśnie MongoDB. Mam tylko podstawową wiedzę z zakresu tej bazy, więc bardzo chciałbym również sam wiedzieć:

  1. Jaki jest zakres zastosowań tejże bazy i w czym wygrywa z MySQL czy tam PostgreSQL?
  2. Czy nie ma to przypadkiem ścisłego związku z również chyba modnymi technologiami typu Angular.js, Metor.js, NodeJS?
  3. Czy też może jest to taki model biznesowy i te technologie są wybierane przez niektóre firmy zajmujące się realizacją webserwisów bazując na technologiach które mało kto zna, nie wiem może chodzi o ograniczenie albo pozbycie się konkurencji (tak żeby zapewnić sobie robotę przy dalszych pracach związanych z rozbudową serwisów)?
  4. Czy też może wygrywa tu potrzeba biznesowa a chodzi o większe serwisy i duży ruch?
AB
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 8 lat
  • Postów:229
0
Czarny Krawiec napisał(a):

Skąd k#$%a taki szał na MongoDB? Gadam z kumplem, mówi mi, że szukają webmastera ze znajomością MongoDB. Gadam z drugim kumplem, mówi że przechodzą w jego firmie w kluczowych serwisach na MongoDB. Ktoś inny, chwali się że w poprzedniej firmie to pracowali w MongoDB. W dupach im się poprzewracało, mysql stał się nudny, czy co?

Akurat trafiałeś na kilka przypadków użycia mongo. Nie sądzę aby mnogo wypierało mysqla w zastosowaniach webowych, ale nie mam rzetelnej statystyki, piszę to tylko w oparciu o własne spostrzeżenia. Osobiście używam postgresa do zastosowań webowych, a to wcale nie znaczy, że postgres wypiera mysqla.

Pozdrawiam

Aventus
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 2 lata
  • Lokalizacja:UK
  • Postów:2235
6

W dupach im się poprzewracało, mysql stał się nudny, czy co?

Śmiem twierdzić że słaby z Ciebie programista skoro masz takie podejście. Nawet jeśli jesteś w stanie coś tam kodzić to nie widzisz szerszej perspektywy i nie pojmujesz że w świecie programowania (i w świecie ogólnie) zmiany są czymś normalnym i jeśli jest to ewolucja a nie rewolucja to nie ma w tym nic złego. Nie wiem skąd wśród programistów tyle twardogłowych konserwatystów, przecież to się wyklucza z ideą IT. Gdyby myśleć tak jak Ty to po dziś dzień wszyscy pisali byśmy w COBOLu i FOTRANie.

Poza tym wyolbrzymiasz, bazy SQL nadaj mają się dobrze.


Na każdy złożony problem istnieje rozwiązanie które jest proste, szybkie i błędne.
edytowany 1x, ostatnio: Aventus
xfin
W Cobolu i FORTRANIE? Przy dobrych wiatrach ;) Przełączanie kabelków, albo asm conajwyżej.
LU
Czym innym jest zmiana na coś lepszego, a czym innym fakt, że ludzie w IT mają tendencję do rzucania się na nowe technologie zanim to dobrze przemyślą.
Aventus
W pełni się z tym zgadzam, ale nijak to się ma do jakże wymownego postu OP.
AB
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 8 lat
  • Postów:229
0
drorat1 napisał(a):

Spotkałem się ostatnio z takim serwisem opartym o Node.js, Meteor.js oraz właśnie MongoDB.

Hmmm następny przypadek użycia, może faktycznie jakaś moda na mongo się zaczyna.

drorat1 napisał(a):

Mam tylko podstawową wiedzę z zakresu tej bazy, więc bardzo chciałbym również sam wiedzieć:

Żeby nie było nieporozumień, ja też mam minimalną wiedzę z mongo, aczkolwiek miałem okazję oglądać kilka ciekawych benchmarków.

drorat1 napisał(a):
  1. Jaki jest zakres zastosowań tejże bazy i w czym wygrywa z MySQL czy tam PostgreSQL?

Trudno mi się wypowiadać, bo nie wiem czy mongo było dobrze skonfigurowane i dobrze zoptymalizowane w tych przypadkach które widziałem. Nie znam na tyle, aby mieć pewność. Co do czego jestem pewny:

  1. W mnogo można zainstalować shardery teoretycznie na dowolnej ilości komputerów. Widziałem na własne oczy, jak z każdym komputerem czas trudnego zapytania spadał liniowo.
  2. Baza jest zorienowana na dokument, co jest wadą i zaletą. Ze względu na to, że dziś bazy często zawierają dane o zmiennym rozmiarze (np. string od zera do 4096 bajtów), tę cechę można uznać w 90% za zaletę.
  3. Mongo oparte jest na JS - z tego prosty wniosek, że w ciągu najbliższych 20 lat nie napiszą tak dobrych optymalizatorów jakie już są do sqla.
  4. W postgresie wprowadzili arrays które można indeksować, czyli zalety dowolnych pól w mnogo poszły do lamusa. Jednak w przypadku gdy chcemy przechowywać w dokumencie dowolne pary (nazwa,wartość), to mongo to lepiej zaindeksuje i może szybciej wyszukać, bo bez joinów - no chyba że narzut JS wszystko zniweczy - byś musiał sam sprawdzić.
  5. Rzekoma szybkość zapisu - póki co na oczy tego jeszcze nie widziałem, może w mongo nie wyłączyli dziennikowania gdy miałem okazję oglądać?
drorat1 napisał(a):
  1. Czy nie ma to przypadkiem ścisłego związku z również chyba modnymi technologiami typu Angular.js, Metor.js, NodeJS?

Tutaj zupełnie nie mam wiedzy.

drorat1 napisał(a):
  1. Czy też może jest to taki model biznesowy i te technologie są wybierane przez niektóre firmy zajmujące się realizacją webserwisów bazując na technologiach które mało kto zna, nie wiem może chodzi o ograniczenie albo pozbycie się konkurencji (tak żeby zapewnić sobie robotę przy dalszych pracach związanych z rozbudową serwisów)?

Być może jest to prawda. I pracownicy są bardziej lojalni, bo gdzie potrzebują ze znajomością nietypowych technologii?

drorat1 napisał(a):
  1. Czy też może wygrywa tu potrzeba biznesowa a chodzi o większe serwisy i duży ruch?
</quote> Duży ruch nie, duży ruch obsłuży każda baza z replikacją. Jak już, to czasochłonne zapytania na ogromnych zbiorach danych. Ale aby uzyskać takie przyspieszenie, to trzeba bardzo dużej ilości komputerów, bo mongo jest skutecznie spowalniane przez JS. Jaki serwis stać na zakup np. 1000 komputerów - jest to koszt około 1mln dolarów. Fakt że zapytania na takim klastrze mogą działać np. 200-500 razy szybciej niż na mysqlu. Ja bym wolał zlecić napianie w C++ specjalistycznej bazy do serwisu i potem uruchomić serwis na 10 komputerach a nie na 1000.

Pozdrawiam

edytowany 1x, ostatnio: artur_bredzki
AB
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 8 lat
  • Postów:229
1
Aventus napisał(a):

W dupach im się poprzewracało, mysql stał się nudny, czy co?

Śmiem twierdzić że słaby z Ciebie programista skoro masz takie podejście.

A ja śmiem twierdzić, że trochę racji ma, chociażby dlatego, że używanie mongo do małego serwisu jest w 90% troche jak strzelanie z armaty do komara, w 9% ta armata może jest uzasadniona ale droga, pozostaje może 1% sensownych przypadków. Jeśli akurat nie trafili na ten 1%, to faktycznie im się w dupach poprzewracało.

shagrin
A na podstawie czego te statystyki?
Aventus
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 2 lata
  • Lokalizacja:UK
  • Postów:2235
1

@artur_bredzki jak najbardziej, nigdy nie twierdziłem że Mongo jest złotym środkiem i wszystko powinno iść w tym kierunku. To się tyczy wszelkich technologii- jakiekolwiek nieuzasadnione użycie, a szczególnie na podstawie aktualnych trendów jest błędne a wręcz głupie. W poprzednim poście odnosiłem się jedynie do nastawienia autora tego wątku.


Na każdy złożony problem istnieje rozwiązanie które jest proste, szybkie i błędne.
0

A PHP 7 porzuciło wsparcie MySQL? Jaki SQL teraz promowane jest z nowym PHP, czy to MongoDB?

PA
  • Rejestracja:ponad 22 lata
  • Ostatnio:około 8 godzin
  • Postów:3866
0
Świetny Mleczarzh napisał(a):

A PHP 7 porzuciło wsparcie MySQL? Jaki SQL teraz promowane jest z nowym PHP, czy to MongoDB?

Nie porzyciło już w wersji 5.5 api mysql było depracated, pozostaje PDO lub mysqli
http://php.net/manual/en/mysqlinfo.api.choosing.php

0

https://pl.wikipedia.org/wiki/MongoDB

Nie wiem na ile dane w wiki są aktualne, ale jeśli MongoDB dalej nie wspiera w pełni UTF-8 i brakuje mu innych funkcji jak np. w MySQL to szkoda na niego czasu. Może być szybki ale lepiej wybrać coś wolniejszego i być pewnym, że da się zrobić to co planujesz.

vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
2

O MongoDB trudno powiedzieć że jest to "technologia, którą mało kto zna". Może w Polsce, chociaż też wątpię.
Jak na razie, z tego co mi wiadomo:

  • MongoDB nie jest najszybsze w swojej dziedzinie (Document Store). Ponoć lepsze jest Couchbase lub Cassandra (Column Store). Ale najszybsze nie zawsze jest najlepsze dla klienta. Zresztą "najlepsze" to bardzo ogólnikowe stwierdzenie.
  • MongoDB nie wspiera transakcji (podobnie jak MyISAM), można ew. coś tam samemu wymyślać, ale będzie to pracochłonne: https://docs.mongodb.com/v3.2/core/write-operations-atomicity/
  • MongoDB w odróżnieniu od baz relacyjnych bezproblemowo się skaluje (chociaż nie idealnie) na wiele komputerów,
  • w bazach relacyjnych najbliższe rozwiązanie (sharding) wymaga ręcznego kodowania warunków lub użycia wspierającego to ORM-a: https://docs.jboss.org/hibernate/shards/3.0/reference/en/html_single/
  • MongoDB wspiera bardzo dużą liczbę języków programowania
  • MongoDB zapytuje się przy pomocy JSON-a a nie JavaScript-a, JavaScript to tylko jeden z wielu możliwych języków sterujących
  • od MongoDB pochodzi litera M w stosie "MEAN"

O bazach NoSQL w zasadzie nie powinno się już pytać "dlaczego?" tylko raczej "gdzie?".
Lista takich rozwiązań jest długa: http://nosql-database.org/

edytowany 1x, ostatnio: vpiotr
Maciej Cąderek
Maciej Cąderek
  • Rejestracja:ponad 9 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Warszawa
  • Postów:1264
0

@artur_bredzki

Mongo oparte jest na JS - z tego prosty wniosek, że w ciągu najbliższych 20 lat nie napiszą tak dobrych optymalizatorów jakie już są do sqla

Ale aby uzyskać takie przyspieszenie, to trzeba bardzo dużej ilości komputerów, bo mongo jest skutecznie spowalniane przez JS

Skąd Ty to wziąłeś? Mongo jest napisane w C/C++, JS jest tam wykorzystywany tylko do skryptowania: https://docs.mongodb.com/v3.0/core/server-side-javascript/

drorat1
  • Rejestracja:ponad 15 lat
  • Ostatnio:około 2 lata
  • Lokalizacja:Krasnystaw
  • Postów:1181
0
vpiotr napisał(a):

Pytanie czy z tego właśnie powodu może się nadawać do rejestracji choćby płatności (za jakieś dajmy na to płatne usługi w serwisie) na koncie każdego zarejestrowanego użytkownika? Właściwie to chodzi o jakiekolwiek inne ważne dane. Tutaj chodzi mi o takie operacje jak commit albo rollback, w przypadku MySQL.

Wiadomo że w MySQL można składować dane sesyjne każdego użytkownika, np. w takiej tabel sessions i z silnikiem MyISAM (tak przynajmniej jest rozwiązane w założeniach przez FW w którym pracuję), stąd też jest pytanie jakiego typu dane tam w tym mongo składować?

  1. Sesje?
  2. Dane tymczasowe?
  3. Cache?

Pytanie czy MongoDB może być np. wykorzystywane tylko jako świetne uzupełnienie dla MySQL w serwisie a nie jako baza podstawowa?

  • MongoDB w odróżnieniu od baz relacyjnych bezproblemowo się skaluje (chociaż nie idealnie) na wiele komputerów,

Jak wyżej. Chodzi o to czy z tych powodu serwis może być oparty w całości o Mongo czy tez Mongo ma być jakimś uzupełnieniem?

  • MongoDB zapytuje się przy pomocy JSON-a a nie JavaScript-a, JavaScript to tylko jeden z wielu możliwych języków sterujących

I z tego powodu też jest pytanie, czy wybór nie jest przypadkiem podyktowany tym jak się pracuje w tych frameworkach jak Meteor.js, Angular.js i o perspektywy (nie wiem, może łatwość implementacji)?

vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
0
AB
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 8 lat
  • Postów:229
0
Aventus napisał(a):

@artur_bredzki jak najbardziej, nigdy nie twierdziłem że Mongo jest złotym środkiem i wszystko powinno iść w tym kierunku. To się tyczy wszelkich technologii- jakiekolwiek nieuzasadnione użycie, a szczególnie na podstawie aktualnych trendów jest błędne a wręcz głupie. W poprzednim poście odnosiłem się jedynie do nastawienia autora tego wątku.

Też piszę o nastawieniu autora. W typowych przypadkach autor ma rację, w 99% użycie mongo jest pomyłką, szpanerstwem, itd.

AB
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 8 lat
  • Postów:229
0
vpiotr napisał(a):

Z tego co pamiętam, to wspiera transakcje w obrępie jednego dokumentu.

Pozdrawiam

vpiotr
Nie jest to transakcja tylko "operacja atomowa" - patrz pierwsze zdanie z tego linku.
AB
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 8 lat
  • Postów:229
0
Maciej Cąderek napisał(a):

Skąd Ty to wziąłeś? Mongo jest napisane w C/C++, JS jest tam wykorzystywany tylko do skryptowania: https://docs.mongodb.com/v3.0/core/server-side-javascript/

Właśnie o te 'tylko' chodzi.

AB
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 8 lat
  • Postów:229
0
drorat1 napisał(a):

Pytanie czy z tego właśnie powodu może się nadawać do rejestracji choćby płatności (za jakieś dajmy na to płatne usługi w serwisie) na koncie każdego zarejestrowanego użytkownika? Właściwie to chodzi o jakiekolwiek inne ważne dane. Tutaj chodzi mi o takie operacje jak commit albo rollback, w przypadku MySQL.

Na poziomie jednego dokumentu MongoDB daje gwarancje co do spójności danych. Jeśli uda Ci się tak zaprojektować bazę, aby taka spójność wystarczała, to będzie się nadawało.

drorat1 napisał(a):

Wiadomo że w MySQL można składować dane sesyjne każdego użytkownika, np. w takiej tabel sessions i z silnikiem MyISAM (tak przynajmniej jest rozwiązane w założeniach przez FW w którym pracuję), stąd też jest pytanie jakiego typu dane tam w tym mongo składować?

  1. Sesje?
  2. Dane tymczasowe?
  3. Cache?

Normalnie można trzymać dowolne dane tak jak w bazach SQL.

drorat1 napisał(a):

Pytanie czy MongoDB może być np. wykorzystywane tylko jako świetne uzupełnienie dla MySQL w serwisie a nie jako baza podstawowa?

Myślę że zbyt mongo jest zbyt podobne do mysql aby używać w jednej aplikacji jednej i drugiej bazy - chyba że do jakiegoś importu/eksportu danych, ale to co innego.

drorat1 napisał(a):

Jak wyżej. Chodzi o to czy z tych powodu serwis może być oparty w całości o Mongo czy tez Mongo ma być jakimś uzupełnieniem?

Może być, ale w oparciu o moją minimalną wiedzę odnoszę wrażenie, że to się opłaca tylko gdy:

  • trzeba szybko aplikację wykonać (nie można miesiącami dziargać w C++)
  • nie da się uniknąć długotrwałych zapytań do bazy
  • są pieniądze na wynajęcie dziesiątek lub setek komputerów.
    Moim zdaniem te warunki występują rzadko. Ale nie znam w pełni mongo, mogę się co do czegoś mylić.
  • MongoDB zapytuje się przy pomocy JSON-a a nie JavaScript-a, JavaScript to tylko jeden z wielu możliwych języków sterujących

Rozróżnienie jest bez sensu, bo JSON jest przecież elementem JavaScriptu. Właśnie o to chodzi że JSON (ogólnie JavaScript) leci do bazy jako zapytanie. Pewnie mongo ma jakieś API i do C++, ale czy wykorzystywanie tego API nadal jest efektywną metodą budowania aplikacji?

drorat1 napisał(a):

I z tego powodu też jest pytanie, czy wybór nie jest przypadkiem podyktowany tym jak się pracuje w tych frameworkach jak Meteor.js, Angular.js i o perspektywy (nie wiem, może łatwość implementacji)?

Nie wiem nic na ten temat.

Pozdrawiam

edytowany 1x, ostatnio: artur_bredzki
vpiotr
JSON to podzbiór JavaScriptu, ale obecnie to są dwie różne rzeczy. JSON to format danych, JavaScript język programowania. Warto umieć odróżniać te dwie rzeczy.
AB
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 8 lat
  • Postów:229
0

JSON to podzbiór JavaScriptu, ale obecnie to są dwie różne rzeczy. JSON to format danych, JavaScript język programowania. Warto umieć odróżniać te dwie rzeczy.

Warto sprawdzić zanim się komuś zasugeruje że jak idiota nie rozróżnia podstawowych rzeczy.
Polecam przykład:
https://docs.mongodb.com/manual/tutorial/map-reduce-examples
Widzimy funkcje, pętle, zmienne - język JavaScript w całej obfitości, a nie tylko JSON.

vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
2
artur_bredzki napisał(a):

JSON to podzbiór JavaScriptu, ale obecnie to są dwie różne rzeczy. JSON to format danych, JavaScript język programowania. Warto umieć odróżniać te dwie rzeczy.

Warto sprawdzić zanim się komuś zasugeruje że jak idiota nie rozróżnia podstawowych rzeczy.
Polecam przykład:
https://docs.mongodb.com/manual/tutorial/map-reduce-examples
Widzimy funkcje, pętle, zmienne - język JavaScript w całej obfitości, a nie tylko JSON.

Nie bądź taki ostry dla siebie. Map-reduce rzeczywiście używa funkcji w JS, reszta to JSON.

AB
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 8 lat
  • Postów:229
0
vpiotr napisał(a):

Nie bądź taki ostry dla siebie. Map-reduce rzeczywiście używa funkcji w JS, reszta to JSON.

Zwykłe find używa JS:
https://docs.mongodb.com/manual/reference/operator/query/where/

vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
0
artur_bredzki napisał(a):
vpiotr napisał(a):

Nie bądź taki ostry dla siebie. Map-reduce rzeczywiście używa funkcji w JS, reszta to JSON.

Zwykłe find używa JS:
https://docs.mongodb.com/manual/reference/operator/query/where/

No tak, masz rację, tylko weź pod uwagę że sami autorzy tego oprogramowania odradzają ten operator (co ma związek z tym od czego ta dyskusja się zaczęła - że JavaScript w kontekście bazy danych słabo się optymalizuje):

$where evaluates JavaScript and cannot take advantage of indexes. Therefore, query performance improves when you express your query using the standard MongoDB operators (e.g., $gt, $in).
In general, you should use $where only when you can’t express your query using another operator. If you must use $where, try to include at least one other standard query operator to filter the result set. Using $where alone requires a collection scan.

AB
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 8 lat
  • Postów:229
0
vpiotr napisał(a):
artur_bredzki napisał(a):
vpiotr napisał(a):

Nie bądź taki ostry dla siebie. Map-reduce rzeczywiście używa funkcji w JS, reszta to JSON.

Zwykłe find używa JS:
https://docs.mongodb.com/manual/reference/operator/query/where/

No tak, masz rację, tylko weź pod uwagę że sami autorzy tego oprogramowania odradzają ten operator (co ma związek z tym od czego ta dyskusja się zaczęła - że JavaScript w kontekście bazy danych słabo się optymalizuje):

$where evaluates JavaScript and cannot take advantage of indexes. Therefore, query performance improves when you express your query using the standard MongoDB operators (e.g., $gt, $in).
In general, you should use $where only when you can’t express your query using another operator. If you must use $where, try to include at least one other standard query operator to filter the result set. Using $where alone requires a collection scan.

Ok, czyli zmieniasz to co poprzednio napisałeś, że mongo nie używa w zapytaniach js, na to, że można obyć się bez js, więc można równie łatwo napisać optymalizator do mongo jak do sqla. Na tyle nie znam mongo, aby wiedzieć czy da się obyć bez js. Po ilości operatorów można wnioskować że masz rację. Ale nawet jeśli teoretycznie można napisać dobry optymalizator do mongo, to pozostaje moja druga wątpliwość: czy napisali i czy włożyli w mongo tak dużo pracy jak w myqla czy postgresa. Kolejna wątpliwość dotyczy indeksów, ciekawe jak dobrze mongo wykorzystuje indeksy. Mongo ma np. fajną funkcję skip, ciekawe czy indeksy wspomagają tę funkcję, czy podobnie jak w popularnych bazach sql, nie wspomagają. Od razu wyjaśnię, funkcja skip to w przybliżeniu limit w mysqlu i offset w postgresie.

Pozdrawiam

vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
0

Wygląda na to, że JavaScript to takie rozszerzenie funkcjonalności MongoDB. Powiedzmy jak język procedur składowanych dla baz relacyjnych.
Pewnie w większości wypadków można się bez tego obyć (używając zamiast niego wyrażeń typu $gt, $in), a na te kilka specjalnych okazji masz super-elastyczną składnię w postaci JavaScript-a. To się tyczy wszystkiego poza map-reduce. Do Map Reduce każdy przykład który znajduję opiera się o JavaScript.

02
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 8 lat
  • Postów:1176
1

Bo jak to ktos ladnie okreslil na tym forum "programisci rzucaja sie na nowe technologie jak szczerbaty na suchary".
http://cryto.net/~joepie91/blog/2015/07/19/why-you-should-never-ever-ever-use-mongodb/

A do tego dobrze przemyslana technologia jaka jest SQL jest juz od dawna passe (no i trzeba by sie jeszcze nauczyc programowania deklaratywnego zeby byc efektywnym w sqlu, co dla wielu jest ponad sily).

KR
Moderator
  • Rejestracja:prawie 21 lat
  • Ostatnio:2 dni
  • Postów:2964
6

Mongo oparte jest na JS - z tego prosty wniosek, że w ciągu najbliższych 20 lat nie napiszą tak dobrych optymalizatorów jakie już są do sqla

Non sequitur. Z twojej przesłanki (Mongo oparte na JS) nie wynika wcale Twój wniosek (nie napiszą tak dobrych optymalizatorów).

Co ma język do jakości optymalizatora? Bardzo niewiele. Można napisać świetny optymalizator w JS i beznadziejny w C++.
O jakości optymalizatora decydują przede wszystkim umiejętności programistów i użyte algorytmy. Np. MySQL ma optymalizator napisany w C i obiektywnie przez długi czas był (a może nadal jest) to jeden z najsłabszych optymalizatorów oparty na regułach. W czasach, kiedy MySQL walczył aby efektywnie wykonać zapytania zawierające ledwie 2 złączenia, inne optymalizatory nie miały problemów z zapytaniami z 10 i więcej złączeniami i używały zaawansowanych metod kosztowych (nawet PostgreSQL) i to od wielu lat. Sam optymalizator nie musi być wcale bardzo szybki, musi za to dawać dobre plany zapytań, a to jest łatwiej uzyskać pisząc go w języku wysokiego poziomu.

Z kolei silnik składowania danych Mongo jest napisany w C++, oparty o pliki mapowane pamięciowo i nie ma tam ani jednej linijki w JS. Jest to swoją drogą beznadziejna decyzja projektowa, która powoduje, że MongoDB dostaje solidne bęcki praktycznie w każdym benchmarku, gdzie ilość danych przekracza rozmiar dostępnego RAMu. Nawet od baz napisanych w Javie :P

Na poziomie jednego dokumentu MongoDB daje gwarancje co do spójności danych. Jeśli uda Ci się tak zaprojektować bazę, aby taka spójność wystarczała, to będzie się nadawało.

Nie daje.
https://aphyr.com/posts/322-jepsen-mongodb-stale-reads

In this post, we’ll see that Mongo’s consistency model is broken by design: not only can “strictly consistent” reads see stale versions of documents, but they can also return garbage data from writes that never should have occurred


Odpowiadając na pytanie - dlaczego Mongo jest takie popularne:

  1. Bo ma proste i dość spójne API. Zapytania w JS. Dane w JS. Wyniki zapytań w JS. JS każdy prawie zna, a jak nie zna, to w podstawowym zakresie może się w dzień nauczyć.
  2. Bo ma dobrą i przyjazną początkującym dokumentację.
  3. Bo można je szybko postawić na laptopie i od razu działa bez większych ceregieli.
  4. Bo ma prosty, dynamiczny model danych. Minuta czytania i wiadomo o co chodzi. Znacznie prostszy niż RDBMSy.
  5. Bo przez brak sztywnego schematu daje poczucie, że nie trzeba jakoś bardzo projektować modelu danych. Jak zabraknie jakiegoś pola czy trzeba będzie zmienić strukturę, to się zmieni później i Mongo wszystko łyknie.
  6. Bo ma stosunkowo mało ograniczeń jeśli chodzi o wyszukiwanie względem innych NoSQLi. Nie tak jak w Cassandrze, gdzie trzeba pomyśleć np. o kolejności kolumn, bo później będzie cięzko wyszukiwać po czymś tam.
  7. Bo jest dość szybkie o ile nie wychodzimy poza RAM.

Jednak jak się wejdzie w temat głębiej to się okazuje że:

  1. Skalowanie Mongo to droga przez mękę.
  2. Wydajność ssie dla dużych zestawów danych wychodzących znacznie poza RAM.
  3. Większość gwarancji odnośnie spójności danych nie jest prawdziwa.
  4. Dynamiczny schemat przy dużym projekcie może szybko doprowadzić do bałaganu.

Podsumowując - Mongo to jest taki jakby PHP baz danych.

Disclaimer: Pracuję przy Cassandrze, więc mogę być trochę nieobiektywny, choć próbowałem :D

edytowany 1x, ostatnio: Krolik
vpiotr
Jeśli chodzi o "stale reads" to pewnie to wynika z tego że MongoDB należy do kategorii "eventually consistent data store". Na stronie projektu tego nie znajdziesz raczej, ale jest parę stron o MongoDB w tym kontekście, przykład: https://mariadb.org/eventually-consistent-databases-state-of-the-art/
Maciej Cąderek
Maciej Cąderek
No wreszcie ktoś coś mądrego napisał, chyba nawet obiektywnie Ci wyszło ;)
KR
@vpiotr nie, nie wynika z tego, bo po pierwsze dokumentacja Mongo twierdzi, że to nie jest "eventually consistent data store", po drugie Mongo nie spełnia nawet warunków dla bycia "eventually consistent", ponieważ w większości trybów pracy możliwe jest utracenie potwierdzonego zapisu.
KA
bardzo mądry post zwłaszcza o tym MySQL
Bartosz Wójcik
  • Rejestracja:około 14 lat
  • Ostatnio:ponad 4 lata
  • Postów:439
0

Przypomniała mi się historia z MongoDB w social network Diaspora

http://www.sarahmei.com/blog/2013/11/11/why-you-should-never-use-mongodb/

KR
Tam to raczej nie była wina MongoDB, a problem w ewidentnym niedopasowaniu narzędzia do zastosowania. To tak jakby narzekać na banana, że trudno się nim wbija gwoździe, zamiast wziąć młotek.
Maciej Cąderek
Maciej Cąderek
  • Rejestracja:ponad 9 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Warszawa
  • Postów:1264
0

@Krolik
Jak już jesteśmy przy NoSQL - masz jakąś opinię o ArangoDB?
Używam tego bo klient sobie zażyczył, używa się fajnie, ale nie wiem jak to się sprawdza na dłuższą metę.

KR
Nie, nic o ArangoDB nie wiem.
Maciej Cąderek
Maciej Cąderek
@Krolik Ok, dzięki - jak ktoś przypadkiem ma doświadczenie to pisać ;)
AB
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 8 lat
  • Postów:229
0
Krolik napisał(a):

Non sequitur. Z twojej przesłanki (Mongo oparte na JS) nie wynika wcale Twój wniosek (nie napiszą tak dobrych optymalizatorów).

Mój wniosek był inny, a mianowicie że równie łatwo nie pisze się optymalizatorów do sqla co do js. Poza tym to jest już jest trochę nieaktualne w tym wątku, byś musiał przeczytać wszystkie posty, szczególnie z vpiotr. Zgodziliśmy się że optymalizowanie zapytania w JSON jest porównywalnie trudne do optymalizowania zapytania w SQLu.

Krolik napisał(a):

Co ma język do jakości optymalizatora?

Nie chodziło o jakość optymalizatora, ale to trudności napisania optymalizatora.

Krolik napisał(a):

Sam optymalizator nie musi być wcale bardzo szybki, musi za to dawać dobre plany zapytań, a to jest łatwiej uzyskać pisząc go w języku wysokiego poziomu.

W połowie zgodzę się z Tobą, często, może właśnie w połowie przypadków, jest tak jak napisałeś. Ale zwróć uwagę na dwie sprawy:

  1. Jeśli zapytanie na kiepskim planie wykonuje się 1.0s, na dobrym planie 0.9s, a (wolny) optymalizator działa 0.3s, to sam rozumiesz że samo użycie optymalizatora już szkodzi.
  2. Jeśli wolny optymalizator napiszemy np. w Pythonie, a taki sam wydajny w C++, to ten w C++ w tym samym czasie może wykonać około 100 razy więcej obliczeń, więc może lepiej zoptymalizować.
Krolik napisał(a):

Z kolei silnik składowania danych Mongo jest napisany w C++, oparty o pliki mapowane pamięciowo i nie ma tam ani jednej linijki w JS. Jest to swoją drogą beznadziejna decyzja projektowa, która powoduje, że MongoDB dostaje solidne bęcki praktycznie w każdym benchmarku, gdzie ilość danych przekracza rozmiar dostępnego RAMu. Nawet od baz napisanych w Javie :P

Nie mam szczegółowej wiedzy na temat Mongo, więc nie wiem czy dostaje lanie czy nie. Ale na pewno popełniasz kilka błędów:

  1. Java jest językiem kompilowanym, bardzo wydajnym, a wąskim gardłem może być dostęp do danych w RAM lub dysku, więc napisanie 'nawet w javie' jest pomyłką
  2. Proponuję eksperyment: Weź jakąś listę, wektor danych nawet w RAM, napisz jakiś bardziej skomplikowany warunek nawet w C++, potem uruchom fullscan i zobacz jaki będzie czas wykonania gdy ilość danych zajmie pamięć dzisiejszego mocnego komputera (np. 64-256GB). Potem odpowiedz sobie na pytanie, jak często taki czas oczekiwania na odpowiedź jest dopuszczalny. Wniosek będzie oczywisty: gdy dane przekraczają bufor ram, to dostawiamy kolejny sharder i mongo daje właśnie takie możliwości. Baza postgres niby też daje takie możliwości, ale map-reduce trzeba zrobić sobie samemu, a w mongo jest gotowe.
Krolik napisał(a):

Nie daje.
https://aphyr.com/posts/322-jepsen-mongodb-stale-reads
In this post, we’ll see that Mongo’s consistency model is broken by design: not only can “strictly consistent” reads see stale versions of documents, but they can also return garbage data from writes that never should have occurred

Ktoś kłamie, nie wiem kto:
http://student.agh.edu.pl/~chamot/bazy/
[
Załózmy, że kilka procesów na raz chce dodać wartość w tabeli 'groups'. Klient nie musi sie martwić o transakcyjność. MongoDB rozwiązuje ten problem. Każda operacja zmieniająca stan dokumentu usuwa go oraz wstawia nowy, zaktualizowany. System bazy danych dba o synchronizację tych dwóch operacji tak, by każdy klient widział te same dane.
]

Krolik napisał(a):
  1. Bo ma proste i dość spójne API. Zapytania w JS. Dane w JS. Wyniki zapytań w JS. JS każdy prawie zna, a jak nie zna, to w podstawowym zakresie może się w dzień nauczyć.

Moim zdaniem SQL jest prostszy.

Krolik napisał(a):
  1. Bo ma dobrą i przyjazną początkującym dokumentację.

Przypominam sobie czasy gdy miałem pierwszy kontakt z SQLem. Kupiłem jakąś książeczkę za parę zł i po kilku dniach całkiem sporo umiałem zrobić.

Krolik napisał(a):
  1. Bo można je szybko postawić na laptopie i od razu działa bez większych ceregieli.

Z bazami SQL mam mniej problemów. Np. drivera mongodb do C++ nie udało mi się skompilować, pomimo że poświęciłem na to cały dzień.

Krolik napisał(a):
  1. Bo ma prosty, dynamiczny model danych. Minuta czytania i wiadomo o co chodzi. Znacznie prostszy niż RDBMSy.

Dane zorganizowane w wiersze i kolumny też są proste.

Krolik napisał(a):
  1. Bo przez brak sztywnego schematu daje poczucie, że nie trzeba jakoś bardzo projektować modelu danych. Jak zabraknie jakiegoś pola czy trzeba będzie zmienić strukturę, to się zmieni później i Mongo wszystko łyknie.

Do tabeli sqlowej też można dodać pole.

Krolik napisał(a):
  1. Bo ma stosunkowo mało ograniczeń jeśli chodzi o wyszukiwanie względem innych NoSQLi. Nie tak jak w Cassandrze, gdzie trzeba pomyśleć np. o kolejności kolumn, bo później będzie cięzko wyszukiwać po czymś tam.

Nie znam casandry.

Krolik napisał(a):
  1. Bo jest dość szybkie o ile nie wychodzimy poza RAM.

Nie widziałem dużo dobrych porównań, ale w tym co widziałem, to (na jednym sharderze) mongo raczej było wolniejsze niż postgresql.

Krolik napisał(a):
  1. Skalowanie Mongo to droga przez mękę.

Nie widziałem dużych i skomplikowanych przykładów do skalowania, ale doinstalowanie shardera jest proste.

Krolik napisał(a):
  1. Wydajność ssie dla dużych zestawów danych wychodzących znacznie poza RAM.

Jeśli wydajność jest ważna to w ogóle inne obliczenia niż w RAM odpadają, no chyba że mamy tylko proste zapytania i można zrobić bezpośredni skok do zaindeksowanego rekordu.

Krolik napisał(a):
  1. Większość gwarancji odnośnie spójności danych nie jest prawdziwa.

No nie wiem, jakie jest źródło tej informacji?

Krolik napisał(a):
  1. Dynamiczny schemat przy dużym projekcie może szybko doprowadzić do bałaganu.

Zgadzam się że może, ale nie musi.

Krolik napisał(a):

Podsumowując - Mongo to jest taki jakby PHP baz danych.

Jest analogia do dynamicznego typowania - zgadzam się.

Pozdrawiam

PA
  • Rejestracja:ponad 22 lata
  • Ostatnio:około 8 godzin
  • Postów:3866
0

@Krolik co sprawiło,że uzyłeś cassandry? Wcinam się w dyskusje bo nie znam nikogo kto używa produkcyjnie NoSQL. Zakładam jednak, że zrobiłeś jakiś research, więc chciałbym "wykorzystać" Twoją wiedzę ;)
Bardziej interesuje mnie dlaczego NoSQL, bo tak na szybko przeglądając info o casandrze to zastanawiam się dlaczego nie jakiś RDBMS? Jakbyś mógł opisać czego ci brakuje w porównaniu do silników "SQL". Bez szczególnego wyróżniania i udowodniania wyzszości po prostu iteresują mnie doświadczenia z frontu.

@artur_bredzki nie schodźmy na tematy możliwości technicznych, wykorzystajmy, że są na tym forum osoby z doświadczeniem No SQL i nauczmy się czegoś nowego. (to piszę odnośnie naszej dyskusji NoSQL vs SQL ;))

Zobacz pozostały 1 komentarz
PA
@vpiotr celowo jako post nie komentarz, bo fajnie by było się dowiedzieć wiecej o bazach NoSQL nie tylko mongoDB, jeżeli masz doświadczenia z produkcyjnym wdrożeniem mongo to chętnie przeczytam o Twoich doświadczeniach. Chciałem po prostu skierować rozmowę na wymianę doświadczeń, bo mam wrażenie, że skręcamy w stronę gównoburzy ;)
Maciej Cąderek
Maciej Cąderek
Z tego co wiem to Krolik współtworzy Cassandre a nie jej tylko uzywa
PA
Tego nie wiem, tym chetniej posłucham co ma na ten temat do powiedzenia...
Maciej Cąderek
Maciej Cąderek
"Bardziej interesuje mnie dlaczego NoSQL, bo tak na szybko przeglądając info o casandrze to zastanawiam się dlaczego nie jakiś RDBMS? " - bo narzędzia dobiera się do potrzeb -> https://www.youtube.com/watch?v=hv2dKtPq0ME
PA
@Maciej Cąderek że narzędzie dobiera się do potrzeb to wiem... Bardziej mi chodzi o to, ze nie bardzo znam zastosowania NoSQL, a nigdy baza "SQL" mnie nie ograniczała. Pewnie to wynika z tego, że jestem "zakorzeniony" w SQL, ale też fajnie poznać praktyczne przykłady z ich zaletami i wadami... cassandra też nie jest jedyna jest m.in HBase, SimpleDB. I taka wiedza mnie interesuje, a nie żę FB ma indeks liczony w setkach TB....
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)