Nie widzę sensu używania baz SQL

1

Tak się powinno w pierwszej kolejności podchodzić do tematu modelowania domeny, i nie ważne czy używamy SQL, NoSQL czy zapisujemy sobie dane w dokumencie teksotwym (taki żart)

Ależ tutaj masz rację, pod tym względem że w aplikacji rdzeniem są obiekty domenowe i UseCas'y, za to baza danych to szczegół. Znam i bardzo popieram to podejście zwane architekturą heksagonalną albo czystą, nie musisz mi tego tłumaczyć. Chodzi mi już o praktyczną implentację detalu.
Np. masz pracę dyplomową, ma ona tytuł, ma studentów którzy ją robią, recenzje, promotora.
Logiczne wydaje się że obiekt domenowy to byłoby coś takiego:

data class Thesis(val id: thesisId, val students: Collection<Students>, val reviews: Collection<Reviews>) //itd

Ale z kolei jeden student może miec wiele prac:

data class Student(val id: studentId, val theses: Collections<Thesis>) //itd

I rzeczywiście, na poziomie obiektu domowego to może być sensowne, tylko jak byś to ogarnął w bazie danych NOSQL gdzie masz np. wiele do wielu. Robił duplikaty?

Bo skoro mamy tak zaawansowane wymagania do obsługi zapytań to na litość- nie katujmy nimi bazy która przechowuje obiekty domenowe. Zastosujmy do tego CQRS i obsłużmy zapytania po stronie odczytu (read side).

Czyli de facto i tak musimy ogarniać bazę relacyjną. Co więcej, na ogół rzadko wykorzystujemy cały model domenowy orzy odczycie.
Nie twierdze że bazy danych NoSQL nie mają zalet, zwłaszcza np. ElasticSearch na pewno byłby lepszy do szukania transakcji po fragmencie nazwy czy opisu, ale nie zgadzam się że NoSQL powinien być "domyślną opcją"

1

I rzeczywiście, na poziomie obiektu domowego to może być sensowne, tylko jak byś to ogarnął w bazie danych NOSQL gdzie masz np. wiele do wielu. Robił duplikaty?

Przede wszystkim zastosował bym podejście znane w DDD i traktował Thesis oraz Student jako agregaty, i zgodnie z zasadą agregatów np. Thesis nie miało by referencji do obiektów Student, tylko kolekcja Students miała by same ID studentów. To samo z odwrotnością tej zależności, czyli Student miałby same IDs Thesis. Bazy dokumentowe nie oznaczają że wszystko zawsze ładujemy do jednego dokumentu.

Czyli de facto i tak musimy ogarniać bazę relacyjną.

Zwróć uwagę że kiedy napisałem o SQL w tym przypadku chodziło mi tylko o możliwości generowania złożonych zapytań. Twój read model w takim przypadku niemiałby relacji, w sensie że nie wymagałby złożonych joinów. Poza tym przestawiłem to tylko jako jedną z możliwości obsługi zaawansowanych zapytań. Również dobrze mógłbyś zastosować inna technologię, chociażby wymieniony przez Ciebie ElasticSearch.

Co więcej, na ogół rzadko wykorzystujemy cały model domenowy orzy odczycie.

No właśnie! W sumie to nie wiem o co chodzi z tym zdaniem, przecież potwierdza to tylko to co pisałem wcześniej.

Nie twierdze że bazy danych NoSQL nie mają zalet, zwłaszcza np. ElasticSearch na pewno byłby lepszy do szukania transakcji po fragmencie nazwy czy opisu, ale nie zgadzam się że NoSQL powinien być "domyślną opcją"

Ok szanuję to ale oczywiście uważam za błędne. Chociażby dla tego że z bazą dokumentową po prostu zapisujesz cały obiekt do bazy. Co za tym idzie masz mniej roboty.

1

NoSQL jest zbyt 2017, teraz na topie są bazy NewSQL typu CockroachDB

https://softwareengineeringdaily.com/2019/02/24/what-is-new-about-newsql/

NewSQL is a new approach to relational databases that wants to combine transactional ACID (atomicity, consistency, isolation, durability) guarantees of good ol’ RDBMSs and the horizontal scalability of NoSQL. It sounds like a perfect solution, the best of both worlds. What took it so long to arrive?

;)

just kiddin

5

. Thesis nie miało by referencji do obiektów Student, tylko kolekcja Students miała by same ID studentów. To samo z odwrotnością tej zależności, czyli Student miałby same IDs Thesis. Bazy dokumentowe nie oznaczają że wszystko zawsze ładujemy do jednego dokumentu.

Czyli de facto robiłbyś joiny. Czy nie o to chodzi w bazach danych NoSQL żeby unikać joinów? Tzn każdy artykuł o wyborze NoSQL vs SQl mówił że jeśli mamy powiązania typu tabelki to należy wybierac SQL

0

Czyli de facto robiłbyś joiny. Czy nie o to chodzi w bazach danych NoSQL żeby unikać joinów?

Zabawne że to co napisałeś w drugim zdaniu, to jest dokładnie to samo niezrozumienie zagadnienia którym sam się wykazałem 2 lata temu w podlikowanym w pierwszym poście wątku. Przede wszystkim nigdy w pełni nie uniknie się jakichś powiązań do innych obiektów, to normalne. Rzecz w tym że przy takich bazach dokumentowych chodzi o to żeby w jak największym stopniu trzymać powiązane dane razem (spójność agregatów). Ale to jest celem, a nie to żeby unikać powiązań. Powiązania i tak się pojawią.

Jeśli chodzi o same joiny, to jeśli przez to rozumiesz konieczność wyciągania tych powiązanych obiektów (referencji) i zwracania ich w wyniku zapytań, to znów należy wspomnieć o konieczność innego podejścia do modelowania. Joiny w SQL stostuje się dla tego że operujemy na znormalizowanych danych, a w NoSQL normalizacji się unika tam gdzie to możliwe (co nie znaczy że się w ogóle jej nie stosuje, po raz kolejny podkreślę- chodzi o spójność agregatów). Zaryzykuję stwierdzenie że joiny w SQL to efekt uboczny natury normalizowania danych, w NoSQL ta zależność jest odwrócona. Jeśli mowa o CQRS no to w ogóle joiny nie są potrzebne, bo zbudujesz model do odczytu przygotowany na potrzeby konkretnego widoku.

Ale załóżmy że nie stosujemy CQRS i przechowujemy jedynie "czyste" modele domenowe. I tak nie będziesz za każdym razem wyciągał całego grafu obiektów jeśli np. chcesz jedynie wyświetlić dane studenta. I vice versa- być może nie potrzebujesz wyciągać danych studenta, kiedy chesz wyświetlić Thesis. Albo aplikacja kliencka potrzebuje i jednego, i drugiego, ale już ma część danych. Bo np. dane studenta już miała w pamięci, zanim użytkownik wszedł w zakładkę wyświetlania Thesis dla danego studenta. Jeszcze innym podejściem byłoby przechowywanie w dokumencie Student wraz z listą ID do Thesis jakies sumaryczne informacje, które zawsze chcemy wyświetlić ze studentem (np. tytuł). Ale to wszystko oczywiście zależy od wymagań i niesie ze sobą inne wyzwania, szczególnie ten ostatni przypadek.

No i na sam koniec mamy to że niektóre bazy (takie jak np. RavenDB) pozwalają nam załadować dodatkowe dokumenty w locie. Możemy np. załadować studenta z ID 1, oraz poinstruować bazę że wraz z tym dokumentem chcemy załadować wszystkie dokuemnty z ID które znajdują się w kolekcji Thesis tego studenta. I tak- możesz powiedzieć że mamy tutaj "joina". Tylko że nic to nie zmienia- nadal mamy wszystkie zalety bazy dokumentowej, i przechowujemy nasze obiekty jako spójna całość, a kiedy zachodzi potrzeba doładowania powiązanych dokumentów to po prostu to robimy. Ale robimy to na potrzeby konkretnego przypadku, i nie ma w tym nic złego.

Tzn każdy artykuł o wyborze NoSQL vs SQl mówił że jeśli mamy powiązania typu tabelki to należy wybierac SQL

Ogólnie to sam padłem ofiarą wszelkiej maści artykułów, i sam myślałem że celem nadrzędnym NoSQL jest unikanie powiązań między encjami. Nic bardziej mylnego. Powiedziałbym że celem nadrzędnym baz NoSQL (szczególnie dokumentowych) jest skupienie się na spójności obiektów (agregaty) i trakowanie referencji jako dodatek a nie nadrzędne narzędzie w celu normalizacji danych. Takie podejście w zasadzie promuje to co już zapewne już znasz- spójny model domenowy. Zaletą jest to że pozwala nam unikać konieczności mapowania tego modelu na znormalizowane relacje. Zachęcam do oglądniecia podlinkowanych przeze mnie wcześniej prezentacji na YT, szczególnie Modeling in a Non Relational World.

6

@Aventus wielokrotnie podkreślasz wygodę NoSQL w porównaniu z SQL dlatego mam pytanie - w czym NoSQL jest lepszy od SQL z perspektywy programisty w 2020 roku?

  • DB to szczegół implementacyjny, jakieś tam I/O device schowane gdzieś pod spodem, dopóki nie zaczynasz jawnie korzystać z ficzerów danego DBMS możesz relatywnie łatwo wymienić go na inny - przynajmniej w teorii
  • najczęściej polegasz na istniejących już driverach i bibliotekach (szczególnie bez driverów byłoby ciężko), nawet jeśli budujesz sam zapytania - gdzieś po drodze wchodzi jakiś mapper / serializacja, nie piszesz raczej własnego boilerplate do mapowania rowów / JSONów / czegokolwiek na obiekty
  • samych zapytań w 80% przypadków też raczej nie musisz składać bezpośrednio - nawet jeśli nie chcesz używać ORMa, są jeszcze DSLe i/lub LINQ które to ułatwiają

Jak już jesteśmy przy zapytaniach, nie widzę jakiejś szczególnej przewagi takiej formy zapytania:

db.sales.aggregate([
   {
      $project: {
         items: {
            $filter: {
               input: "$items",
               as: "item",
               cond: { $gte: [ "$$item.price", 100 ] }
            }
         }
      }
   }
])

nad takim:

select * from sales.items where sales.items.price >= 100

Więc jak dla mnie z tej perspektywy odpowiedź na pytanie dlaczego to SQL a nie NoSQL jest domyślnym wyborem brzmi bo na jedno wychodzi.

Być może powodem, dla którego mógłbym chcieć wykorzystać np. bazę dokumentową zamiast relacyjnej jest problem N + 1, wokół którego parę postów już krążyło mówiąc o konieczności (lub nie) joinowania danych. Jak jest w SQL wszyscy wiemy, większa swoboda modelowania danych w np. bazach dokumentowych niż w SQL nam to ładnie rowiąże - ale z drugiej strony jak w bazie dokumentowej zaczniesz wprowadzać referencje, to masz dwie opcje

  • baza wspiera rozwiązywanie tych referencji w ramach pojedynczego zapytania i pokrywa Twój przypadek
  • baza nie wspiera tego w ogóle lub wspiera, ale nie pokrywa Twojego przypadku

To, w który przypadek wpadniesz zależy już od konkretnego DBMS i tego, jakie ma przydatne ficzury - ale znowu, tutaj uzależniasz się od konkretnego ficzura konkretnej DB. Wymienisz Mongo które ma $lookup i $graphLookup na jakieś inne FooDB, które nie ma odpowiednika lub jest znacznie uboższy, i wpadasz w wariant drugi - i te same problemy co w SQL.

A jak już jesteśmy przy wsparciu DBMS dla różnych ficzurów - jak już ktoś wspomniał chociażby Postgres wspiera obsługę dokumentów przez JSONB, więc masz możliwość trzymania jakichś tam np. agregatów obiektów w relacyjnej bazie bez konieczności rozwiązywania referencji do innych tabel. No ale znowu, uzależnianie się od konkretnego DBMS. No i indeksy na JSONB są takie sobie, szczególnie jak wchodzą jakieś agregaty itp.

I na koniec, odnosząc się bezpośrednio do kilku zdań

dziś uważam że bazy SQL nie powinny być domyślnym wyborem

Obstawiam, że w 80% przypadków największym skutkiem wyboru SQL / NoSQL jako "domyślnego" podejścia byłby triumf fanboyów danego rozwiązania, a w pozostałych i tak wybiera się to, co wydaje się bardziej pasować do problemu.

Domyślny wybór jest domyślny - nie najlepszy. Po prostu jakiś. Nie na tyle zły, żeby od razu aż paliło do szukania alternatywy - chociaż później może już palić. Poza tym o tym, co jest domyślne, a co nie niekoniecznie decydują kwestie techniczne - myślę że dużo więcej mają tu do powiedzenia chociażby naleciałości historyczne i statystyka, a te się lubią kumulować i dostawać korpo-boosty.

Nie trzeba zajmować się tworzeniem skryptów SQL czy migracji jeśli używamy jakiegoś pełnoprawnego ORMa.

To, że do SQL też są pełnoprawne ORMy, narzędzia do automatycznych migracji, DSLe, LINQ już ustaliliśmy :P

Szybkość i wygoda rozwoju oprogramowania przy użyciu baz NoSQL jest zdecydowanie jednym z największych atutów tego rodzaju baz. Dodanie nowej właściwości/pola do obiektu to dosłownie kwestia dodania tego właśnie pola- nic więcej nie trzeba robić.

W świetle powyższego ten atut jest trochę wyolbrzymiony

Następnym argumentem jest prędkość i skalowalność [...]

Dużo zależy od konkretnego przypadku, ilości danych, obciążenia, sryliona innych czynników. Czasami możesz zwyczajnie nie musisz cisnąć w kierunku super-duper skalowalności, zwykły SQL i co najwyżej jakaś replikacja mogą wystarczyć, choć dałoby się pchać tam Cassandrę. Równie dobrze można by się rozwodzić nad tym, że wykonanie synchroniczne jest do kitu i abslutnie wszystkie aplikacje mogłoby być asynchroniczne i eventowe.

skoro o integralności mowa [...] Tylko czy jest to problemem? Otóż moim zdaniem nie. Takie rzeczy można obsłużyć w logice aplikacji bezpośrednio przed zapisem, lub później kiedy faktycznie ta nie istniejąca encja będzie nam potrzebna.

To by oznaczało, że w kwestii rozwiązywania problemów z referencjami lecimy w wariant nr. 2 i jakoś je ogarniamy po stronie aplikacji - czyli w pewnej mierze ta potencjalna przewaga bierze nam w łeb?

bardzo często lepsze efekty można osiągnąć stosując konkretną bazę NoSQL do konkretnego problemu, lub stosując poliglotyczne (nie wiem czy to dobre określenie) podejście gdzie baza SQL jest jedynie elementem, a nie głównym medium przechowywania i wyciągania danych.

A z tym poliglotycznym podejściem do baz nie jest potem trochę jak z poliglotycznym podejściem do języków programowania? Niby wszystko fajnie i elastycznie a potem trzeba to utrzymywać, no i w przypadku DB jeśli masz kilka baz do różnych celów to gdzieś musisz zdecydować, kiedy z której skorzystasz i w jakim celu, więc nagle baza przestaje być szczegółem i wjeżdża cała na biało na pierwszy plan.

1

Jeszcze należy dodać fakt że SQL jest znanym po prostu standardem i to łatwym w nauce. Po co sie uczyć jakiejś bazy NOSQL do reportowania skoro mam już ten SQL - i mogę go (z jakimś drobnymi różnicami ewentualnie) wykorzystać z 5 albo i więcej bazach danych, a wydajnośc jest pewnie podobna. W moim przypadku mogę powiedziec że 70/80 % baz danych z jakich korzystałem w różnych aplikacjach którymi zajmowałem się powinny być bazami relacyjnymi (przynajmniej taki jest mój osąd sytuacji :D).
NoSQL bym wykorzystał do dwóch rzeczy:
1)Wyszukiwanie tekstowe(jak Elastic Search)
2)Trzymanie takich rzeczy jak jakieś konfiguracje, czy niezależne struktury jsono-podobne. Jeśli np. jest jakaś oferta kupna czegoś edytowalna w CMS, albo np. opis książki to w takim przypadku NoSQL wydaje się senowniejszy

1

Tylko tak tu wrzucę :D

2

Jak mam dane, których struktura jest znana i wolno zmienna, to nie mam odruchu 'a może by tak pójść w NoSQL?' i nie mam przekonania, że 'rozwiązania NoSQL powinny być domyślnym wyborem' ;) Lubię Postgresa, Oracle i wolę pracować ze spójnymi danymi, ale nie odrzucam innych rozwiązań na starcie (no prawie...). Na pewno nie podejmowałbym decyzji o wyborze NoSQL/RDBMS na podstawie preferencji programistycznych, tylko problemu jaki trzeba rozwiązać i kontekstu w jakim problem występuje. W obecnym projekcie łączę Oracle/Pandas/plik płaskie/Zeppelin i nie narzekam.

Co zapewniają bazy (relacyjne)?

  • odczyt/zapis danych
  • współdzielony skład danych
  • współbieżny dostęp
  • ACID
  • mechanizmy bezpieczeństwa (szyfrowanie, kontrola dostępu, audyt operacji, backupy, ...)
  • replikacja danych
  • wyszukiwanie danych wg dowolnych kryteriów modelu danych -> np. dane testowe -> "wybierz po N przypadków klientów (+ odpowiadające kombinacje produktów) z najczęstszymi kombinacjami produktów, które to kombinacje dają 95% pokrycia bazy klientów" (ciekaw jestem jak w NoSQLach taki case zrobić.. klaster Spark? Utrzymywać indeks w ElasticSearchu i aktualizować przy aktywacji/rezygnacji z produktu? Makabra jakaś.)
  • etc.

Czy do rozwiązania konkretnego problemu potrzebuję wszystkich charakterystyk oferowanych przez bazy? Może te "dodatkowe" charakterystyki są mi obojętne/zbędne? Może nie potrzebuję bazy danych i serializacja na lokalny/klastrowy system plików w zupełności wystarczy? Kto to będzie utrzymywał? Czy dostępni są ludzie, którzy mogą rozwijać rozwiązanie w wybranym stosie technologicznym?

0

Nie wiem czy widzicie, ale uwagi miedzy SQL, a NoSQL mają trochę zblizony charakter do statyczne vs dynamiczne.

Ogólnie osoby ze świata SQL, czy jezyków statycznych częściej powołują się na techniczne i biznesowe aspekty takie jak standardy, wzorce, pisanie formalnego kodu, wydajnosć, patrzenie na projekt przez pryzmat utrzymywania, pracę gdzie ludzie często przychodzą, odchodzą. Pracę nad system, którego często nie idzie pojąć ot tak. Ponadto w zwyczaju lubimy planować, mieć kontrolę nad tym co robimy, ale zarazem słusznie unikamy brania na siebie odpowiedzialności za niestandardowe rozwiązania! Jeśli ktoś potrzebuje dodatkowych wrażeń to docelowo w takim sposobie bycia prędzej wybierze się na wspinaczkę po skałach, albo polata na szmacie zamiast spędzać dzień po godzinach w robocie z powodu utraty danych kluczowego klienta.

Inne rozwiązania są mile widziane, ale z umiarem i przede wszystkim muszą być odpowiedzią na wyżej wspominiany punkt widzenia i muszą odpowiadać na potrzeby takie jak wydajność, większe bezpieczeństwo, czy poprawa w zarządzaniu.

To co @Aventus chce przekazać to przede wszystkim prostota - ale o tę rzecz biznes raczej się nie stara. Biznes zdecydowanie bardziej woli postawić na trudniejsze rozwiązania o ile te są łatwiejsze w kontrolowaniu :-)

Co więcej, bazy SQL nie są proste. Są łatwe, bo są znane, są mniejszym złem, ale nie są proste - są złożone. Dla 99% osób w branży bazy są czarną skrzynką, czymś co z reguły działa, ale jak - niektórzy cóś wiedzą, są też domysły, ale to część prawdy, nawet nie pół. Z punktu widzenia aplikacji jak zakładasz blokady na rekordy to baza nie powie Ci czy dobrze robisz, czy nie zapomniałeś o czymś jeszcze. Jak robisz intensywne zapytania, inne operacje jakie korzystają z bazy mogą na tym ucierpieć. Atutem baz SQL jest to, że są ogólne, wszechstronne i jednocześnie to jest ich mankamentem, im więcej rzeczy na niej robisz tym bardziej musisz uważać, by inne zadania nie oberwały.

Problemem prostoty jest to, że ona nie zwolnienia z myślenia - jest wręcz przeciwnie, trzeba mysleć nawet więcej niż zwykle. W prostocie nie chodzi o łatwość wprowadzania bezmyślnych zmian. Jak dasz komuś bez doświadczenia javascript czy mongodb to powstanie masakra, nawet doświadczony javascriptowiec, czy bazodanowiec nie będzie chciał przy czymś takim pracować. Proste rozwiązania nie mówią jak mają być obsługiwane, nie korygują wprost postępowania programisty, przez co ani biznes ani programisci nie mają o takich rozwiązaniach dobrego zdania.

Paradosksem prostoty jest fakt, że proste rozwiązania są na ogół ciężkie do kontroli (powyższy przypadek), na ogół wymagają więcej cierpliwości, czasu do opanowania, wymagają wprawy i myślenia. W pewnym sensie to wkład bliski nauce graniu na instrumencie - nie jedną osobę taka rzecz doprowadza wręcz do frustracji, jednakże we właściwych dłoniach proste narzędzia to klucz, to pierwszy krok do tworzenia niezawodnych systemów.

6

Mam wrażenie, że próbujecie przedstawić rozwiązanie NoSQL w niepoprawny sposób. Po pierwsze obrażacie resztę, która myśli inaczej:

Aventus napisał(a):

Nie ma tu żadnego zapętlania, co najwyżej problem z czytaniem ze zrozumieniem.

Aventus napisał(a):

ty chyba nie zrozumiałeś w ogóle tego co ja tam napisałem.

Po drugie sugerujecie jakbyśmy całkowicie niczego nie ogarniali - piszecie nam o jakimś modelowaniu i jakiś podstawach jak do jakiś tłuków i sugerujecie jednocześnie jakby prawidłowy model biznesowy mógł istnieć jedynie w bazie NoSQL a relacje w bazie SQL to było jakieś wcielone zło (gdy to relacja to po prostu nazwanie rzeczy po imieniu i w 90% świat IT na tym świetnie działa). Próbujecie narzucić innym swoje myślenie, które jest sprzeczne z rzeczywistością - nie przedstawiliście ani jednego sensownego dowodu waszych słów tylko jakieś ogólniki piszecie, że bazy NoSQL są łatwiejsze albo że powinny być domyślnym wyborem albo że

Co więcej, bazy SQL nie są proste. Są łatwe, bo są znane, są mniejszym złem, ale nie są proste - są złożone. Dla 99% osób w branży bazy są czarną skrzynką, czymś co z reguły działa, ale jak - niektórzy cóś wiedzą, są też domysły, ale to część prawdy, nawet nie pół.

W tym wątku ludzie z baz SQL przedstawili conajmniej z trzy doświadczenia negujące wasze gadanie czarno na białym po koleii na temat szybkości baz NoSQL czy np. trochę wyżej ktoś dał porównanie zapytania SQL i NoSQL, gdzie widać, że zapytanie SQL jest prostsze i czytelniejsze. Wy natomiast nie podaliście ani jednego sensownego argumentu.

@Aventus oszukujesz całkowicie rzeczywistość używając pokręconej logiki cwaniaków, którzy najpierw próbują Cię obrazić a na koniec wmówią Ci, że w sumie to Cię komplementowali. Przez kilka stron nawet w tytule tego wątku gadasz jakie to bazy SQL są beznadziejne względem NoSQL a nagle próbujesz wmawiać co innego:

Aventus napisał(a):

Znów- czytanie ze zrozumieniem się kłania. Ja nigdzie nie napisałem że SQL jest "be".

To nie jest prawidłowa logika - jak mam przeczytać z jakimkolwiek uznaniem twoje zdanie na temat NoSQL w momencie kiedy używasz tak nierzeczywistej logiki. Nie robisz promocji w ten sposób świetnym rozwiązaniom NoSQL.

1

Ani sql ani nosql nie jest idealne (byłoby gdyvy nie liderzy-debile), ale jeśli miałabym wybór pomiędzy nosql a sql to...... wybieram jednak sql.

1

Nie używam baz właściwie wcale, więc mogę być obiektywnym sędzią tutaj.

Argumenty, które padły za SQL:

  1. jest znany od dawna
  2. wszyscy go używają

Argumenty, które padły za NoSQL:

  1. wygoda dla programisty
  2. elastyczność wprowadzania zmian w modelu

No jakby te za NoSQL brzmią lepiej. Tzn. w ogóle można je uznać za argumenty.

3

Pomijając czy NoSQL jest lepszy czy nie, to niechęć do zmiany wydaje mi się że może wynikać z czegoś co najlepiej obrazuje ten cytat Nobody ever got fired for choosing IBM/Intel/...

który na Quorze tłumaczą tak:

I believe Brian Lawe's answer is closest to my understanding of this phrase, as a former IBMer from the late 70s to late 90s. In short, the risk in the early IT industry of embarking on large projects often exposed decision makers to the chance of losing their jobs because they would be held accountable for failure. Since IBM's size and quality in the older days would help to guarantee a project's outcome (sometimes over budget too) it seemed a logical, safe choice to go with the giant in the room to ensure success. Clearly there were plenty of companies back then who could also do just as well, but the risk of failure often caused decision makers to go with the company that offered that extra layer of insurance, IBM. Not often discussed is the fact that since IBM often marketed many layers up the management chain in order to influence an IT decision, those down the management chain who pushed for non-IBM solutions could find themselves alienated from their management chain and the relationship built with the IBM team. Did they get fired? I am certain that sort of thing happened, but let's be honest, who talked about it and how visible was such a thing in the course of the project.

src: What does the phrase "Nobody ever got fired for choosing IBM" mean?

Czyli mamy nasz Nobody ever got fired for choosing SQL

Na pewno nie pomaga fakt, że najpopularniejsza baza nierelacyjna (co widać w tym wątku) to Mongo, która ma nie najlepszą opinię oraz to, że generalnie więcej osób się skarży (głośniej krzyczy) na problemy niż chwali, co dobrze było widać jak w ostatnim czasie wyszły 2 raporty Jepsen is an effort to improve the safety of distributed databases - nt. Postgresa i właśnie Mongo. Znalezione problemy w Mongo utrzymywały się po różnych agregatorach newsów chyba z tydzień, a nt. Postgresa już chyba ucichło po 2 dniach. Czy też takie hot newsy jak migracja The Guardian, który w PRESENTATION - September 19, 2011 MongoDB at The Guardian używał Mongo, a później Bye bye Mongo, Hello Postgres - 2018

Nie pomaga również to, że dane to nie jest coś z czym chcesz eksperymentować na produkcji, a zabawa bazką postawioną u siebie na dockerze to raczej niezbyt dobry test solidności bazy i jest trochę błędne koło :D

Czas płynie, ludzie się przekonują, bo FAANG i inni "early adopterzy" pokazują że się da, więc minie kilka lat i na taki temat jak ten będziemy patrzeć z XD na twarzy, a OrientDb, dGraph czy Neo4j nie będą czymś egzotycznym

no chyba że jakiś popularny bloger zaliczy wpadkę i odstraszy ludzi na kolejne lata xD lub faktycznie nie sprawdzą się te rozwiązania

A, no i jeszcze wydaje mi się że macie trochę inne perspektywy - OPowi jako archytektowi bardziej zależy na fast-paced development i traktowaniu bazy jako szczegół implementacyjny, który nie wpływa na modelowanie systemu oraz z drugiej strony bardziej adminów?/maintainerów?/programistów? którzy chcą mieć tą całą reliability i porządny tooling i jak najmniej problemów? i temu się nie możecie dogadać, nooby :P

3

@somekind:

Argumenty, które padły za SQL:

  • jest znany od dawna
  • wszyscy go używają

No ja dla mnie to są całkiem sensowne argumenty. Skoro i tak sporo danych będzie musiało być złączonych pomiędzy dokumentami to w efekcie otrzymujemy model relacyjny tylko bez SQL. SQL to standard który więcej osób zna, przez co łatwiej kogoś zatrudnić itp.
Dlaczego Kotlin jest popularny wśród Javovców? Bo kompiluje się to bytecod-u Javy i działają na nim frameworki Javove.

A co do utrzymania i łatwości, weźmy ten mój przypadek:
Mamy recenzenta pracy dyplomowej który np. chce zmienić ocene(nie wnikam w reguły biznesowe, założmy że jest od storny logiki ok)
Sytuacja 1):
mamy baze danych relacyjną: leci update na wiersz w tabeli review, student widzi, pracownik uczelni widzi, wszyscy szczęśliwi
Sytuacja 2)
mamy NoSQL: trzeba robić potencjalnie update w kilku różnych dokumentach, jak zapomnimy ogarnąć jednej mamy niespójność

Na pewno nie pomaga fakt, że najpopularniejsza baza nierelacyjna (co widać w tym wątku) to Mongo

Nie byłbym tego pewien, istnieje duża szansa że ElasticSearch jest bardziej popularny a to też de facto NoSQL i to raczej pozytywnie odbierany (może poza kwestiami security :D )

2

Pojawiło się sporo odpowiedzi więc na wstępnie zaznaczę że przepraszam ale z braku czasu nie dam rady do wszystkiego się ustosunkować. Miejscami będę musiał po prostu odpowiedzieć ogólnie tam gdzie wypadało by rozbić fragment wypowiedzi na więcej segmentów i do każdego odpowiedzieć oddzielnie.

superdurszlak napisał(a):

@Aventus wielokrotnie podkreślasz wygodę NoSQL w porównaniu z SQL dlatego mam pytanie - w czym NoSQL jest lepszy od SQL z perspektywy programisty w 2020 roku?

  • DB to szczegół implementacyjny, jakieś tam I/O device schowane gdzieś pod spodem, dopóki nie zaczynasz jawnie korzystać z ficzerów danego DBMS możesz relatywnie łatwo wymienić go na inny - przynajmniej w teorii
  • najczęściej polegasz na istniejących już driverach i bibliotekach (szczególnie bez driverów byłoby ciężko), nawet jeśli budujesz sam zapytania - gdzieś po drodze wchodzi jakiś mapper / serializacja, nie piszesz raczej własnego boilerplate do mapowania rowów / JSONów / czegokolwiek na obiekty
  • samych zapytań w 80% przypadków też raczej nie musisz składać bezpośrednio - nawet jeśli nie chcesz używać ORMa, są jeszcze DSLe i/lub LINQ które to ułatwiają

Przede wszystkim pisałem o wygodzie. Co do szczegółów implementacyjnych to sami siebie oszukujemy, bo jednak wybór bazy danych- tak, wliczając w to bazy NoSQL- ma swój narzut na to jak piszemy aplikację, jak modelujemy domenę itp. No chyba że lecimy w pełne wyabstrahowanie metody pezystencji danych, ale... tutaj nawet nie zaczynam tematu, bo i w tej dziedzinie toczone są wojenki. Co meritum tego paragrafu- już wymieniałem tę wygodę, przede wszystkim chodzi o brak konieczności zarządzania schemą, przez co w dużej mierze takie operacje jak zapisywanie i ładowanie danych mamy out of the box.

Jak już jesteśmy przy zapytaniach, nie widzę jakiejś szczególnej przewagi (...)

Ja również. Powiedziałbym nawet że pierwsza wersja jest brzydka. Tylko że jak już pisałem wcześniej, z MongoDB mam niewiele wspólnego więc nie do końca rozumiem czemu momentami jestem traktowany jakbym był adowaketem tej konkretnej technologii. Wiem, MongoDB to chyba najpopularniejsza dokumentowa baza, ale takich baz jest bardzo dużo, i co warte podkreślenia- są nowsze, robiące różne rzeczy lepiej i ze znacznie bogatszymi bibilotekami/driverami, np. wspierającymi LINQ.

Być może powodem, dla którego mógłbym chcieć wykorzystać np. bazę dokumentową zamiast relacyjnej jest problem N + 1, wokół którego parę postów już krążyło mówiąc o konieczności (lub nie) joinowania danych. Jak jest w SQL wszyscy wiemy, większa swoboda modelowania danych w np. bazach dokumentowych niż w SQL nam to ładnie rowiąże - ale z drugiej strony jak w bazie dokumentowej zaczniesz wprowadzać referencje, to masz dwie opcje

  • baza wspiera rozwiązywanie tych referencji w ramach pojedynczego zapytania i pokrywa Twój przypadek
  • baza nie wspiera tego w ogóle lub wspiera, ale nie pokrywa Twojego przypadku

To, w który przypadek wpadniesz zależy już od konkretnego DBMS i tego, jakie ma przydatne ficzury - ale znowu, tutaj uzależniasz się od konkretnego ficzura konkretnej DB. Wymienisz Mongo które ma $lookup i $graphLookup na jakieś inne FooDB, które nie ma odpowiednika lub jest znacznie uboższy, i wpadasz w wariant drugi - i te same problemy co w SQL.

No tak, ale to argument nie przemawiający ani za SQL ani NoSQL, bo dotyczy ich tak samo.

Obstawiam, że w 80% przypadków największym skutkiem wyboru SQL / NoSQL jako "domyślnego" podejścia byłby triumf fanboyów danego rozwiązania, a w pozostałych i tak wybiera się to, co wydaje się bardziej pasować do problemu.

Z tym się całkowicie nie zgadzam, wydaje mi się że my programiści lubimy się tak oszukiwać. W większości przypadków używamy tego do czego jesteśmy przyzwyczajeni, zresztą naturalnie poszukujemy uniwersalnych rozwiązań (przysłowiowy młotek). Ja np. nie oszukuję się że stosuję OOP a nie programowanie funkcyjne bo stosuje rozwiązanie które najbrdziej pasuje do danego problem, tylko po prostu nie znam FP na tyle żeby móc dokonać obiektywnego wyboru. Fanboystwa też w tym nie ma. Byłoby gdybym szedł w zaparte i twierdził że nie mam potrzeby stosować FP i tyle, bo OOP pasuje lepiej. Nie znam FP, więc nie mogę tak stwierdzić. Odnoszę natomiast wrażenie że niektórzy (nie wszyscy oczywiście) w tym wątku to właśnie ten drugi przypadek- tacy którzy twierdziliby że OOP bo jest lepsze, mimo że tego drugiego nie znają. Grunt to mieć trochę samokrytyki i zdawać sobie sprawę ze swojej niewiedzy na jakiś temat.

Domyślny wybór jest domyślny - nie najlepszy. Po prostu jakiś. Nie na tyle zły, żeby od razu aż paliło do szukania alternatywy - chociaż później może już palić. Poza tym o tym, co jest domyślne, a co nie niekoniecznie decydują kwestie techniczne - myślę że dużo więcej mają tu do powiedzenia chociażby naleciałości historyczne i statystyka, a te się lubią kumulować i dostawać korpo-boosty.
(...)
To, że do SQL też są pełnoprawne ORMy, narzędzia do automatycznych migracji, DSLe, LINQ już ustaliliśmy :P

Szybkość i wygoda rozwoju oprogramowania przy użyciu baz NoSQL jest zdecydowanie jednym z największych atutów tego rodzaju baz. Dodanie nowej właściwości/pola do obiektu to dosłownie kwestia dodania tego właśnie pola- nic więcej nie trzeba robić.

W świetle powyższego ten atut jest trochę wyolbrzymiony

Nic z tych rzeczy. Po pierwsze to że "ustaliliśmy" ORMy, LINQ itp. nic nie zmienia. Nadal musisz zarządzań w ten czy inny sposób chociażby aktualizacjami bazy danych. I nie uwierzę że nigdy nie zdażyło się że aplikacja Ci wywaliła na środowisku developerskim/testowym, bo np. schema bazy się zmieniła ale w wyniku jakiegoś błędu/przeoczenia kod nie itp. Jeśli komuś nic takiego się ani razu nie stało to śmiem twierdzić że nie pracował przy wystarczająco dużych aplikacjach/projektach.

To by oznaczało, że w kwestii rozwiązywania problemów z referencjami lecimy w wariant nr. 2 i jakoś je ogarniamy po stronie aplikacji - czyli w pewnej mierze ta potencjalna przewaga bierze nam w łeb?

Nie, z powodu wspomnianego przeze mnie kilkukrotnie innego podejścia do modelowania domeny. Dokładnie to samo, "luźne" podejście do referencji stosuje się np. w DDD i event sourcingu, a tam baza danych w zasadzie nie ma znaczenia (z perspektywy kodu domenowego).

A z tym poliglotycznym podejściem do baz nie jest potem trochę jak z poliglotycznym podejściem do języków programowania? Niby wszystko fajnie i elastycznie a potem trzeba to utrzymywać, no i w przypadku DB jeśli masz kilka baz do różnych celów to gdzieś musisz zdecydować, kiedy z której skorzystasz i w jakim celu, więc nagle baza przestaje być szczegółem i wjeżdża cała na biało na pierwszy plan.

Poliglotyczne podejście nie oznacza stosowania multum różnych baz danych, podobnie jak stosowanie mikroserwisów nie oznacza że każdy jest pisany w innej technologii. Można, ale to raczej rzadkość.

@scibi92:

Jeszcze należy dodać fakt że SQL jest znanym po prostu standardem i to łatwym w nauce. Po co sie uczyć jakiejś bazy NOSQL do reportowania skoro mam już ten SQL - i mogę go (z jakimś drobnymi różnicami ewentualnie) wykorzystać z 5 albo i więcej bazach danych, a wydajnośc jest pewnie podobna.

No ok, można mieć takie podejście. To trochę jak z tymi słynnymi klepaczami (bez obraźliwego wydźwięku), jeśli komuś jest wygodnie i nie chce opuszczać strefy komfortu to dla czego by nie. Osoby z takim podejściem mogą śmiało zignorować ten wątek, bo jak już wspomniałem stosowanie NoSQL wiąże się z nauką i przyswojeniem nowego sposobu myślenia.

Poza tym- wiem że zabrzmi to jak słaby PR- z takim podejście nie ma miejsca na innowację. Wbrew pozorom można sobie pozwalać na stosowanie innowacji, i wdrażanie ich na produkcji. Pracowałem nad projektem z początkowym budżetem 25 milionów dolarów (który później urósł jak to zwykle bywa), duży system ubezpieczeniowy. Wybór padł na zastosowanie event sourcingu- nikt w zespole wcześniej go nie używał produkcyjnie. Oczywiście był odpowiedni czas poświęcony na studium wykonalności, prototyp architektury itp. No i zdecydowane podejście- albo robimy to jak należy, zgodnie z powszechnymi praktykami, albo wcale. Da się? Zapewniam że się da. A przecież ktoś mógłby powiedzieć że stawka jest za wysoka aby nie używać czegoś co już wszystkim znane. Uprzedzając żartobliwe pytania- projekt nie padł- odniósł sukces i jest rozwijany do dziś ;)

NoSQL bym wykorzystał do dwóch rzeczy:
1)Wyszukiwanie tekstowe(jak Elastic Search)
2)Trzymanie takich rzeczy jak jakieś konfiguracje, czy niezależne struktury jsono-podobne. Jeśli np. jest jakaś oferta kupna czegoś edytowalna w CMS, albo np. opis książki to w takim przypadku NoSQL wydaje się senowniejszy

Tutaj trochę dziwne, bo z jednej strony sam wcześniej przyznałeś że za dużo nie wiesz na ten temat (wydawało mi się że jesteś chętny się nauczyć), a z drugiej piszesz co w jakim przypadku byś stosował.

No ja dla mnie to są całkiem sensowne argumenty. Skoro i tak sporo danych będzie musiało być złączonych pomiędzy dokumentami to w efekcie otrzymujemy model relacyjny tylko bez SQL.

W ogóle to coraz bardziej jestem przekonany że argument "używaj SQL to modelu relacyjnego, NoSQL tam gdzie nie ma relacji" jest przestarzały i w zasadzie dziś nie ważny. W zasadzie prawie każdy model domenowy da się obrać w ramy podejścia relacyjnego, lub też nie. Stąd tym bardziej moje przekonanie że- w myśl takiego założenia- lepiej zastosować to co szybsze i wygodniejsze w użytkowaniu na codzień. Oczywiście zakładając że ktoś poświęcił czas na naukę konkretnej technologii.

Sytuacja 2)
mamy NoSQL: trzeba robić potencjalnie update w kilku różnych dokumentach, jak zapomnimy ogarnąć jednej mamy niespójność

To jest w sprzeczności z tym co pisałem wcześniej, i de facto kompletnie ignoruje to co wielokrotnie podekreślałem. Chociażby to że bazy NoSQK (szczególnie dokumentowo) nie oznaczają że zawsze unikamy normalizacji. W przypadku który podałeś- czyli wiele encji potrzebujących dane innej encji- jak najbardziej zastosowało by się referencje.Trochę przykre że kompletnie pominąłeś to co wcześniej wyjaśniałem, tylko po to by napisać argument który jest zwyczajnie bezpodstawny. Właśnie to jest problem o którym pisałem- zabieranie się za jakąś technologię nie tak jak się powinno to robić. Pozwolę sobie zacytować samego siebie, bo kończy się to tak:

zrobimy po swojemu a nie jak należy, a później obwinimy technologię/wzorzec

@karolinaa
Wahałem się czy w ogóle odnieść się do Twojego postu. Po pierwsze nikogo nie obrażam- szanuję swoich rozmówców, szanuję ich czas ale i szanuję własny czas. Jeśli ktoś ignoruje to co piszę, czyta między wierszami i wstawia mi w usta słowa któych nie powiedziałem to oczywiście że wypomnę brak czytania ze zrozumieniem. To nie jest obraza. Ponadto dotyczyło to jednego użytkownika i zacytowane przez Ciebie moje wypowiedzi są wyrwane z kontekstu.

To nie jest prawidłowa logika - jak mam przeczytać z jakimkolwiek uznaniem twoje zdanie na temat NoSQL w momencie kiedy używasz tak nierzeczywistej logiki. Nie robisz promocji w ten sposób świetnym rozwiązaniom NoSQL.

Tak jak pisałem wcześniej- podałem konkretne argumenty dla tamtego użytkownika. W ogóle nie wiem o co Ci chodzi z "nierzeczywistą logiką", nie mówiąc już o tym że nie chcę niczemu ani nikomu robić promocji czy anty-promocji. Inna sprawa że w odpowiedzi do Twojego pierwszego postu napisałem merytoryczny (mam nadzieję) komentarz który zgrabnie pominęłaś, tylko po żeby zarzucić mi obrazę innych. Jeśli czujesz się urażona w zwykłej dyskusji na temat baz danych i myślisz że ktoś tu kogoś obraża (o czym pisałaś nawet w jednym z komentarzy na mikroblogu) to może być to przejaw tego że ktoś narusza Twoją strefę komfortu. Może warto zamiast iść w zaparte spróbować poznać temat na własną rękę. W ogóle to jest jakiś słaby żart że uważasz że ten wątek czy ja osobiście obrażają użytkowników baz SQL, tym bardziej że ja sam przez większość lat pracy jako programista używałem właśnie baz SQL i jestem przekonany że jeszcze nie raz przyjdzie mi ich użyć- czy to z wyboru czy też nie.


W ogóle paradoksem tutaj jest to że- jak napisałem na wstępie- z NoSQL korzystam dopiero od niecałych 2 lat, wcześniej znałem tylko SQL. Nie jestem więc jakimś wojownikiem próbującym narzucić innym swoją kocepcję. Postanowiłem tylko podzielić się własnym doświadczeniem, bo ku mojemu zaskoczeniu okazało się że faktycznie są inne rzeczy poza SQL, i faktycznie fajnie się w nich pracuje. Sam uświadomiłem sobie jak bardzo miałem ograniczone perspektywy. Traktowanie wszystkiego co napisałem w opozycji do tego co- w prypadku niektórych- jedyne znane jest więc niepotrzebne. Choć nie ukrywam że dziwi mnie to że tutaj na forum- gdzie przecież tak często można spotkać się z postami o rozwoju, poznawania nowych podejść i technologii- jest jednocześnie tak duży opór jeśli chodzi o SQL i NoSQL. Dziwi mnie tym bardziej że pojawia się ze strony osób które z bazami NoSQL mają małe lub żadne doświadczenie. Trochę tak jak- o czym wspomniałem w tym poście- ja nieznający FP miałbym stawiać stanowczy opór jak tylko ktoś zasugeruje że warto iść w FP. W dodatku pzekręcając argumenty przemawiające za FP, konceptulanie przebierając je w otoczkę OOP i na błędnych założeniach przedstawiać kontrargumenty. Oczywiście nic takiego bym nie robił, znając swoją małą wiedzę w dziedzinie FP. Naiwnie chyba liczyłem na podobne podejście, tym bardziej naiwnie że mały odzew w wątku z przed dwóch lat powinień dać mi jasny sygnał jako mało popularnym podejściem są tutaj bazy NoSQL.

Myślę że na tym można skończyć dyskusję bo faktycznie wszyscy zaczniemy "kręcić się w kółko". Kto chce to coś z tego tematu wyniesie, kto nie to nie. Ja jedynie mam nadzieję że chociaż część czytelników tego wątku zechce zgłębić bardziej temat.

2

No ok, można mieć takie podejście. To trochę jak z tymi słynnymi klepaczami (bez obraźliwego wydźwięku), jeśli komuś jest wygodnie i nie chce opuszczać strefy komfortu to dla czego by nie. Osoby z takim podejściem mogą śmiało zignorować ten wątek, bo jak już wspomniałem stosowanie NoSQL wiąże się z nauką i przyswojeniem nowego sposobu myślenia.

Tu nie chodzi tyle o wygode dla wygody, tylko o odpowiednie wykorzystanie czasów i środków oraz wiedzę innych ludzi. Napisałem wyrażnie że chodzi o sytuacje w której narzędzia które stosuje do pracy są podobne, to jest pragmatyzm. Np. założmy ze zespół korzysta z jakiś baz danych NoSQL, ale się rozpada, ochodzi 3 z 6 ludzi i trzeba znaleźć kogoś kto sobie poradzi z tymi bazami danych.

Poza tym- wiem że zabrzmi to jak słaby PR- z takim podejście nie ma miejsca na innowację. Wbrew pozorom można sobie pozwalać na stosowanie innowacji, i wdrażanie ich na produkcji.

Alez ja jestem za innowacją, np. architekturą hexagonalną, funkcyjnym obsługiwaniem błędów itp. tylko niech innowacja ma jakiś sens.
Architekturę hexagonalną mogę uzasadnić polepszeniem jakości kodu, uzależnieniem się od frameworków, większą elastycznością etc, a w Twoich postach nie widze argumenty który by mnie przekonał że NoSQL jest najbardziej praktyczny

Tutaj trochę dziwne, bo z jednej strony sam wcześniej przyznałeś że za dużo nie wiesz na ten temat (wydawało mi się że jesteś chętny się nauczyć), a z drugiej piszesz co w jakim przypadku byś stosował.

No bo sam doświadczenia komercyjnego z NoSQL poza Elasticiem nie mam. Napisałem to w oparciu bardziej o wiedze teoretyczną, i dlatego tez wspominam Elastica bo z pewnością w swoich zastosowaniach jest o wiele bardziej wygodny i praktyczny niż SQL ;)

To jest w sprzeczności z tym co pisałem wcześniej, i de facto kompletnie ignoruje to co wielokrotnie podekreślałem. Chociażby to że bazy NoSQL (szczególnie dokumentowo) nie oznaczają że zawsze unikamy normalizacji

No dobra, w takim razie co daje użycie NoSQL jesli stosujemy go jak SQLa? Właśnie o to cały czas mi się rozchodzi. Jaki daje efekt zrobienie tabelkowatego schematu w Mongo zamiast Postgresie?
Ale tak czy owak ja sądze że baza danych to szczegół i powinno się ją na koniec dobierać, no chyba że piszemy pet projekt dla siebie ;)
Nie widze tez przeszkód żeby używac kilku baz danych do aplikacji, albo żeby np. część serwisów miała NoSQL,, część SQL, a część w ogóle tylko RAM :D

1

@scibi92:

No dobra, w takim razie co daje użycie NoSQL jesli stosujemy go jak SQLa? Właśnie o to cały czas mi się rozchodzi. Jaki daje efekt zrobienie tabelkowatego schematu w Mongo zamiast Postgresie?

Ehh, faktycznie kręcimy się w kółko... Napisałem że nie chodzi o to aby zawsze unikać normalizacji, więc ty od razu przeskoczyłeś do drugiej skrajności i sugerujesz że robi się tabelkowy schemat w bazie dokumentowej (skończmy z tym Mongo proszę :p). Nic z tych rzeczy.

Dam na szybko kanoniczny przykład- Order, Order Item i Product. W relacyjnej bazie każda z tych encji będzie miała swoją tabele, gdzie Order i Order Item to relacja one-to-many a Order Item i Product to many-to-one. W bazie dokumentowej Order będzie z kolei zapisany razem z order items jako jeden dokument. Obiekt json który będzie posiadał kolekcję order items. Każdy order item będzie z kolei miał ID (referencje) do Product. To jest ta spójność modelu o której mówiłem.

Ale tak czy owak ja sądze że baza danych to szczegół i powinno się ją na koniec dobierać, no chyba że piszemy pet projekt dla siebie

Też tak uważam, i pisałem już o tym wcześniej- z tego też powodu, teraz znając już SQL jak i NoSQL wybrałbym bym NoSQL. Bo w oparciu o NoSQL pisze się zwyczajnie szybciej, mniej czasu spędza się na poboczne zadania (stworzenie migracji, cofnięcie migracji, napisanie skryptu, zarządzie migracjami na innych środowiskach itp).

Nie widze tez przeszkód żeby używać kilku baz danych do aplikacji

To jest właśnie poliglotyczne podejście wymienione wcześniej.

Np. założmy ze zespół korzysta z jakiś baz danych NoSQL, ale się rozpada, ochodzi 3 z 6 ludzi i trzeba znaleźć kogoś kto sobie poradzi z tymi bazami danych.

Z takim podejściem w projektach nie podejmowałoby się innowacji, którą popierasz dalej w swojej wypowiedzi.

Reasumując- raz jeszcze zachęcam do oglądnięcia podlinkowanych prezentacji.

0

Sql, nosql, Oracle, apache, na co to komu wszystko. Plik csv i lecimy z tematem. Potem jak chcę się pisać "zapytania" to 10 linijek w Pythongu i można zdziałać cuda.

Przecież te bazy sql po paru dekadach działalności nie dorobiły się tak podstawowej rzeczy jak sensowne śledzenie zmian w takich bazach. Czyli takiego GITa dla SQL. A idź Pan z tym.

2

@Janusz666: Triggerek na update i masz swoją historię zmian :P

Jest to trochę wywalanie logiki na bazę, ale bardzo proste

0

W większości przypadkow zwykły csv spokojnie starcza do przechowywania danych. Filtrować można w milisekundach za pomocą narzędzi linuxowych typu grep czy cut. Jak trzeba coś zoptymalizować to i tak często rozwiązania z baz danych nie wystarczają i trzeba zastosować jakiś specyficzny algorytm do problemu.

1

@Janusz666: przepraszam, ale co to za dziwadło w tym linku? Po co komu zdublowany dedykowany soift. Wymaga SQL Servera a SQL Server posiada wbudowany edytor z możliwościami identycznymi z tym prograikiem. Także program w stylu protezy

4
Aventus napisał(a):

Co do szczegółów implementacyjnych to sami siebie oszukujemy, bo jednak wybór bazy danych- tak, wliczając w to bazy NoSQL- ma swój narzut na to jak piszemy aplikację, jak modelujemy domenę itp. No chyba że lecimy w pełne wyabstrahowanie metody pezystencji danych, ale... tutaj nawet nie zaczynam tematu, bo i w tej dziedzinie toczone są wojenki.

Niemniej jednak ideałem jest odizolowanie aplikacji od tego, jaki DBMS leży pod spodem - nawet jeśli nie da się tego zrobić w 100%, to przynajmniej staramy się nie robić przeplatańca w którym baza wyskakuje zza każdego rogu. Nikt nie chwali się patrzcie, jaki odwaliliśmy kawał dobrej roboty - czytasz kod i już na poziomie REST API widzisz, że pod spodem jest DynamoDB!. Podobnie, jak (na ogół) nie chcemy uzależniać się od konkretnego systemu operacyjnego albo procesora, pod który piszemy kod - nawet, jeśli jesteśmy niemal pewni, że będziemy deployować na własny serwer z Intelem i RHEL, albo mamy już wybrany jakiś tam dockerowy base image.

Ale to, że narzędzia do tego są wciąż niedoskonałe i czasami musimy (lub wydaje nam się, że musimy) dziobać pod konkretny DBMS - dla przykładu rzeźbiąc jakiś native SQL z obsługą JSONB - to już temat na odrębną dyskusję

Co meritum tego paragrafu- już wymieniałem tę wygodę, przede wszystkim chodzi o brak konieczności zarządzania schemą, przez co w dużej mierze takie operacje jak zapisywanie i ładowanie danych mamy out of the box.

Szczerze mówiąc nie jestem w stanie zgodzić się ze stwierdzeniem, że w NoSQL nie trzeba zarządzać schemą. Co najwyżej nie musimy jawnie zarządzać schemą - ale to co innego niż brak zarządzania.

Wiem, MongoDB to chyba najpopularniejsza dokumentowa baza

To chyba naturalne, że porównując nazwijmy to konkurujące ze sobą podejścia częściej sięgamy do bardziej znanych przykładów. Dla SQL też roztrząsamy raczej Postgresa, Oracle czy MS SQL a nie np. SQLite. Na wspomnienie NoSQL pierwsze przychodzą do głowy chociażby Mongo i Redis.

To, w który przypadek wpadniesz zależy już od konkretnego DBMS i tego, jakie ma przydatne ficzury - ale znowu, tutaj uzależniasz się od konkretnego ficzura konkretnej DB. Wymienisz Mongo które ma $lookup i $graphLookup na jakieś inne FooDB, które nie ma odpowiednika lub jest znacznie uboższy, i wpadasz w wariant drugi - i te same problemy co w SQL.

No tak, ale to argument nie przemawiający ani za SQL ani NoSQL, bo dotyczy ich tak samo.

I o to właśnie jest sedno tej wypowiedzi - ten problem dotyczy obydwu i samo odrzucenie SQL go nie rozwiązuje, bo i tak wróci w jakiejś postaci.

Z tym się całkowicie nie zgadzam, wydaje mi się że my programiści lubimy się tak oszukiwać. W większości przypadków używamy tego do czego jesteśmy przyzwyczajeni, zresztą naturalnie poszukujemy uniwersalnych rozwiązań (przysłowiowy młotek).

To nie jest kwestia przyzwyczajenia i bawienia się młotkiem, po prostu uważam, że w większości przypadków możesz pójść w dowolną stronę (tu SQL vs NoSQL) i jakoś z tym żyć.

Nadal musisz zarządzań w ten czy inny sposób chociażby aktualizacjami bazy danych. I nie uwierzę że nigdy nie zdażyło się że aplikacja Ci wywaliła na środowisku developerskim/testowym, bo np. schema bazy się zmieniła ale w wyniku jakiegoś błędu/przeoczenia kod nie itp. Jeśli komuś nic takiego się ani razu nie stało to śmiem twierdzić że nie pracował przy wystarczająco dużych aplikacjach/projektach.

Różnica jest podobna jak między statycznym a dynamicznym typowaniem - które już tu ktoś chyba przytoczył. W przypadku jawnego zarządzania schemą jest spora szansa, że aplikacja po prostu nie wstanie, build nie przejdzie itd. Dodatkowo definiując migrację od jednej statycznie zdefiniowanej schemy do drugiej niejako wyrażasz pewną intencję.

Co się stanie w sytuacji, gdy wprowadzisz błąd w niejawnie zdefiniowanej schemie i błąd wyjdzie dopiero w locie - gdy okaże się, że wprawdzie aplikacja wstała i baza łyka zmienioną schemę, ale złamałeś kompatybilność wsteczną, jakieś stare dane coś psują, klient nie może wykonać jakiejś operacji przez zepsute dane, a testy tego nie wykryły bo miały np. taki a nie inny zestaw danych testowych?

1

Dajcie mi usecase kiedy według Was baza danych jest lepsza niż csv. Wiem że istnieją ale osobiście po prostu nie miałem styczności, więc jestem ciekaw. I żeby nie było korzystałem trochę z baz sqlowych, wiem jakie są ich funkcjonalności.

8

kiedy według Was baza danych jest lepsza niż csv

@Janusz666: rozumiem, że trollujesz, ale załóżmy, że to pytanie było na serio (wiem, naiwny jestem). W każdym razie, odpowiadając na nie (takie kilka rzeczy, które mi na szybko przyszły do głowy):

  • dostęp jednoczesny
  • kontrola uprawnień użytkowników
  • replikacja i inne mechanizmy zwiększające bezpieczeństwo i/lub dostępność
  • możliwości skalowania
  • dostęp w pełni zdalny z dowolnego miejsca na świecie
  • możliwość zaimplementowania logiki w bazie, triggery, widoki itp
  • wszystko, co daje SQL - chociażby klucze obce, indeksy, ACID/transakcyjność itp.
  • łatwiejsze pobieranie danych (dajesz SELECT * FROM WHERE xxx i baza odpowiada za selekcję danych, a nie że sobie sam musisz przeszukiwać CSV)
1

Wszystko co wymieniłeś można zrobić za pomocą csv i linuxa.

5
Janusz666 napisał(a):

Wszystko co wymieniłeś można zrobić za pomocą csv i linuxa.

Ale po co Ci jakiś Linuks? Przecież masz assemblera, napisz swój system :P

Umiejętność doboru stosownych narzędzi, to jest podstawowy element wiedzy i doświadczenia fachowca, nie tylko w branży IT. Tak samo możesz dziurę w ścianie wydłubać pilniczkiem do paznokci, ale jednak lepiej jest skorzystać z wiertarki. A wiertarki sobie sam nie budujesz, tylko korzystasz z gotowego urządzenia.

0

Wątek już dawno jest na mieliźnie, pora zamknąć. Wszystko mądrę, co się miało powiedzieć, już się powiedziało.
Rozważamy wyższość Wiel ... CSV (skądinąd prawdopodobnie jest to baza NoSQL) nad (wszelkimi) bazami.

0

Ale po co do zrobienia prostych rzeczy dodawać kolejną problematyczną zależność do projektu. Żeby przybić gwóźdź nie trzeba aż czołgu, wystarczy młotek. W niektórych przypadkach sql pewno ma sens, ale w większości zwykły csv i parę podstawowych narzędzi Linuxa starcza. A w IT się wpycha tego sqla wszędzie. 10 milionów rekordów i 7 kolumn i koniecznie musi być SQL, bo to przeciez taki ogrom danych że bez sqla nikt sobie z tym nie poradzi. Jak dla mnie po pierwsze mają dobry marketing, po drugie "Tak się przyjęło", po trzecie wsadzaja na studiach do głów że sql najważniejszy i w ogóle.

1
superdurszlak napisał(a):

Niemniej jednak ideałem jest odizolowanie aplikacji od tego, jaki DBMS leży pod spodem - nawet jeśli nie da się tego zrobić w 100%, to przynajmniej staramy się nie robić przeplatańca w którym baza wyskakuje zza każdego rogu. Nikt nie chwali się patrzcie, jaki odwaliliśmy kawał dobrej roboty - czytasz kod i już na poziomie REST API widzisz, że pod spodem jest DynamoDB!(...)

Pewnie, ciężko się z tym nie zgodzić. Tym bardziej to często przy użyciu SQL (a szczególnie jakiegoś ORM) musimy w naszych klasach reprezentujących encje odzwierciedlać to co narzuca nam dana technologia. Np. w C# to że właściwość będąca referencją musi być virtual (jest tak w NHibernate jeśli dobrze pamiętam) itp. Chcesz unikać takich uzależnień? Wtedy rezygnujesz z używania ORM, no ale tym wracamy do punktu wyjścia. Ewentualnie możesz całkowicie oddzielić klasy domenowe od klas reprezentujących encje w bazie, ale znów- znajdą się głosy za i przeciw takiemu rozwiązaniu, a zależnie od wymagań wydajnościowych systemu taka opcja może być zwyczajnie niedopuszczalna.

Znów, bazy NoSQL znacznie to ułatwiają- chociaż oczywiście też nie do końca, to zależy od konkretnej technologii.

Szczerze mówiąc nie jestem w stanie zgodzić się ze stwierdzeniem, że w NoSQL nie trzeba zarządzać schemą. Co najwyżej nie musimy jawnie zarządzać schemą - ale to co innego niż brak zarządzania.

Nie no oczywiście, to też miałem na myśli. Oczywiście że trzeba rozsądnie podchodzić do modelowania klas które przechowujemy w bazie i tego jak je zmieniamy. Mieć na uwadze jak te zmiany wpłyną na aplikację itp.

Wiem, MongoDB to chyba najpopularniejsza dokumentowa baza

To chyba naturalne, że porównując nazwijmy to konkurujące ze sobą podejścia częściej sięgamy do bardziej znanych przykładów. Dla SQL też roztrząsamy raczej Postgresa, Oracle czy MS SQL a nie np. SQLite. Na wspomnienie NoSQL pierwsze przychodzą do głowy chociażby Mongo i Redis.

Prawda, z tym że w takim razie używanie jakiegoś przypadku konkretnej technologii- np. query w MongoDB- w opozycji do szeroko rozumianego SQL jest też nie na miejscu, bo równie dobrze i ja mogę zacząć podawać przykłady z "lepszej" bazy NoSQL. A tego cały czas unikałem aby trzymać dyskusję na temat szerzej, bardziej abstrakcyjnie rozumianego SQL i NoSQL.

I o to właśnie jest sedno tej wypowiedzi - ten problem dotyczy obydwu i samo odrzucenie SQL go nie rozwiązuje, bo i tak wróci w jakiejś postaci.

Zgadza się. Przecież ja nigdzie nie twierdziłem (chociaż zapewne znajdzie się ktoś kto mi chętnie takie słowa przypisze ;) ) że NoSQL rozwiązuje wszystkie problemy, że nie tworzy nowych itp.

W przypadku jawnego zarządzania schemą jest spora szansa, że aplikacja po prostu nie wstanie, build nie przejdzie itd. Dodatkowo definiując migrację od jednej statycznie zdefiniowanej schemy do drugiej niejako wyrażasz pewną intencję.

Co się stanie w sytuacji, gdy wprowadzisz błąd w niejawnie zdefiniowanej schemie i błąd wyjdzie dopiero w locie - gdy okaże się, że wprawdzie aplikacja wstała i baza łyka zmienioną schemę, ale złamałeś kompatybilność wsteczną, jakieś stare dane coś psują, klient nie może wykonać jakiejś operacji przez zepsute dane, a testy tego nie wykryły bo miały np. taki a nie inny zestaw danych testowych?

To jest bardzo słuszna uwaga i jak najbardziej może być traktowana jako jedna z wad. Zamiast dostać błąd na etapie deployowania nowej schemy do produkcji to dostaniemy błąd później. Nawet w SQL da się wprowadzić jakieś subtelne błędy do danych które nie wykrzaczą od razu ale mogą sprawić problemy ze starymi danymi w trakcie działania aplikacji. Oczywiście w SQL jest to znacznie mniej prawdopodobne, i prędzej dostaniemy błąd na etapie aktualizowania bazy.

Kwestia tylko tego na ile ktoś uważa to za niezbędny "mechanizm bezpieczeństwa" bez którego nie ma co w ogóle brać się za puszczanie systemu w produkcji, a na ile za nieudogodnienie z którym da się żyć. Znów pokuszę się o stwierdzenie że jest w tym podobnie jak z referencyjną integralnością- wbrew pozorom jest nam to potrzebne o wiele mniej niż nam się wydaje. Ale może to dla tego że przez ostatnie kilka lat pracowałem produkcyjnie używając event sourcingu, gdzie również występuje ryzyko tego że wprowadzi się zmiany do jakiegoś eventu które nie będą kompatybilne ze starymi eventami wyemitowanymi przez system. I nagle okazuje się że jakiś użytkownik dostaje błąd bo event sprzed dwóch lat nam wykrzaczył. Zresztą nawet zdarzyło nam się to i uwaga- to nie był koniec świata. Problem został naprawiony i po sprawie. Tak samo postrzegam ryzyko aktualizacji "schemy" w bazach NoSQL.

Nie mówiąc już o tym że przy odpowiednim zarządzaniu należy mieć środowisko przed-produkcyjne, gdzie będziemy mieli również historyczne dane które będziemy testować. Co oczywiście nie zapewni nam w 100% bezpieczeństwa, ale znów- to kwestia naszej tolerancji na taką ewentualność/.

1 użytkowników online, w tym zalogowanych: 0, gości: 1