{"id":6066,"date":"2021-03-22T11:42:18","date_gmt":"2021-03-22T10:42:18","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=6066"},"modified":"2023-10-06T08:28:40","modified_gmt":"2023-10-06T06:28:40","slug":"tabele-i-kolumny-czy-moze-grafy-dokumenty-i-mapy-czyli-jaki-mamy-wybor-planujac-bazy-danych","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/tabele-i-kolumny-czy-moze-grafy-dokumenty-i-mapy-czyli-jaki-mamy-wybor-planujac-bazy-danych\/","title":{"rendered":"Tabele i kolumny, czy mo\u017ce grafy, dokumenty i mapy, czyli jaki mamy wyb\u00f3r planuj\u0105c bazy danych?"},"content":{"rendered":"\n<p>W dzisiejszych czasach zamkni\u0119cie si\u0119 w jednym modelu mo\u017ce okaza\u0107 si\u0119 niewystarczaj\u0105ce. Ju\u017c na etapie planowania projektu, warto rozwa\u017cy\u0107, jak przeprowadzona zostanie implementacja baz danych, oraz jaki silnik najlepiej nada si\u0119 do naszych rozwi\u0105za\u0144.<\/p>\n\n\n\n<p>Spo\u015br\u00f3d wielu istniej\u0105cych struktur danych, najcz\u0119\u015bciej wybieranymi s\u0105 relacyjne (<strong>SQL<\/strong>), lub nierelacyjne (<strong>NoSQL<\/strong>). W tym wpisie postaram si\u0119 pokaza\u0107 kluczowe r\u00f3\u017cnice pomi\u0119dzy tymi strukturami, oraz o czym nale\u017cy pami\u0119ta\u0107 podejmuj\u0105c decyzj\u0119 o implementacji.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Relacyjne bazy danych &#8211; SQL<\/strong><\/h2>\n\n\n\n<p>Jedn\u0105 z najcz\u0119\u015bciej u\u017cywanych struktur danych jest relacyjna baza danych nazywana <strong>SQL &#8211; Structured Query Language<\/strong>. Idea, za kt\u00f3r\u0105 stoi tworzenie relacyjno\u015bci, powsta\u0142a z potrzeby rozwi\u0105zania pewnego problemu. We wczesnych latach rozwoju baz danych aplikacje zapisywa\u0142y dane w swojej w\u0142asnej strukturze. W zwi\u0105zku z tym chc\u0105c tworzy\u0107 aplikacje na podstawie tych danych nale\u017ca\u0142o bardzo dobrze zna\u0107 t\u0119 struktur\u0119, co by\u0142o kosztowne i czasoch\u0142onne. Ci\u0119\u017cko by\u0142o znale\u017a\u0107 specjalist\u00f3w, kt\u00f3rzy mieliby wystarczaj\u0105c\u0105 wiedz\u0119 domenow\u0105 w zakresie danego biznesu. Dodatkowo, nie ujednolicono jeszcze wtedy podej\u015bcia do wyszukiwania brakuj\u0105cych informacji takich jak np. nieznany adres, numer telefonu.<\/p>\n\n\n\n<p>Problem ten pr\u00f3bowano rozwi\u0105za\u0107 poprzez podstawienie kilku specjalnych warto\u015bci maj\u0105cych wype\u0142ni\u0107 luki w rekordach. Jednak dopiero <strong>Edgar Frank Codd<\/strong> wpad\u0142 na genialny w swej prostocie pomys\u0142. W 1979 roku zaproponowa\u0142 on pojedyncz\u0105 warto\u015b\u0107 <strong>NULL<\/strong>. Ta ma\u0142a rewolucja w ca\u0142o\u015bci zmieni\u0142a podej\u015bcie, rozszerzaj\u0105c logik\u0119 dwuwarto\u015bciow\u0105 typow\u0105 dla operator\u00f3w boolean (<strong>Tak, Nie<\/strong>) o por\u00f3wnania do logiki tr\u00f3jwarstwowej. M\u00f3wi\u0105c w skr\u00f3cie, od tej pory na ka\u017cde pytanie da\u0142o si\u0119 odpowiedzie\u0107: <strong>Tak, Nie, Nieznane\/Null<\/strong>. Rozwi\u0105zanie natychmiast znalaz\u0142o zastosowanie. Chwil\u0119 p\u00f3\u017aniej firma znana jako <strong>Relational Software<\/strong> (obecnie Oracle) wypu\u015bci\u0142a na rynek <strong>pierwszy komercyjny relacyjny system zarz\u0105dzania baz\u0105 danych<\/strong> (<strong>RDBMS, czyli Relational Database Management Systems<\/strong>). Od tej pory model relacyjny na dobre zago\u015bci\u0142 jako dominuj\u0105cy system do przechowywania danych.<\/p>\n\n\n\n<p>Kluczem do zrozumienia strukturyzowania danych b\u0119dzie zapoznanie si\u0119 z podstawowymi poj\u0119ciami&nbsp;\u2013 <strong>czyli czym jest baza danych<\/strong>. Jest to zbi\u00f3r tabel oraz narz\u0119dzi, kt\u00f3re stosuje si\u0119 do przekszta\u0142cania i wyszukiwania danych w danym przedsi\u0119biorstwie. Podstawowe konstrukcje, jakie powinien zna\u0107 tester to:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Schemat<\/strong> &#8211; kontener zawieraj\u0105cy wszystkie obiekty wymienione poni\u017cej. Charakteryzuje go mo\u017cliwo\u015b\u0107 nadawania uprawnie\u0144 na wybranym obiekcie. Ka\u017cdy utworzony przez u\u017cytkownika bazy danych schemat b\u0119dzie przypisany do niego domy\u015blnie<\/li>\n\n\n\n<li><strong>Tabela<\/strong> &#8211; zbi\u00f3r ujednoliconych rekord\u00f3w opisuj\u0105cych dany obiekt. Przyk\u0142adem mo\u017ce by\u0107 tabela Pracownicy, kt\u00f3ra b\u0119dzie zawiera\u0142a wszystkie rekordy zwi\u0105zane z pracownikami danego przedsi\u0119biorstwa<\/li>\n\n\n\n<li><strong>Rekord<\/strong> &#8211; pojedynczy wiersz w tabeli. Dla przyk\u0142adu, b\u0119dzie to jeden z pracownik\u00f3w tabeli Pracownicy<\/li>\n\n\n\n<li><strong>Pole<\/strong> &#8211; jedno wybrane pole z wiersza, kt\u00f3re przechowuje jedn\u0105 dan\u0105<\/li>\n\n\n\n<li><strong>Klucze g\u0142\u00f3wne i obce<\/strong>.<\/li>\n<\/ul>\n\n\n\n<p>Dane strukturyzuje si\u0119 poprzez zastosowanie relacji, czyli po\u0142\u0105cze\u0144 mi\u0119dzy tabelami. \u017beby dobrze to zobrazowa\u0107, rozwa\u017cmy przyk\u0142ad nast\u0119puj\u0105cej relacji mi\u0119dzy tabelami. Istniej\u0105 tabele <strong>Plac\u00f3wka<\/strong> oraz <strong>Pracownicy<\/strong>. Tabela <strong>Pracownicy<\/strong>, opr\u00f3cz kolumn przeznaczonych na dane osobowe pracownik\u00f3w przedsi\u0119biorstwa posiada kolumn\u0119 <strong>id_pracownika<\/strong>. Tabela <strong>Plac\u00f3wka<\/strong> posiada dane zwi\u0105zane z wybran\u0105 plac\u00f3wk\u0105 przedsi\u0119biorstwa oraz dodatkowe powi\u0105zanie poprzez kolumn\u0119 <strong>id_pracownika<\/strong>. W tej relacji <strong>Pracownicy.id_pracownika<\/strong> b\u0119dzie kluczem g\u0142\u00f3wnym, a <strong>Plac\u00f3wka.id_pracownika<\/strong> kluczem obcym tabeli <strong>Pracownicy<\/strong> powielaj\u0105c si\u0119 w innej tabeli (<strong>Plac\u00f3wka<\/strong>). W ten spos\u00f3b ka\u017cda z tych dw\u00f3ch tabel ma&nbsp;identyczne, unikatowe warto\u015bci po kt\u00f3rych mo\u017cna powi\u0105za\u0107 pracownik\u00f3w z plac\u00f3wk\u0105, w kt\u00f3rej pracuj\u0105.<\/p>\n\n\n\n<p>Tworz\u0105c wy\u017cej wspomniane tabele baz danych i powi\u0105zania mi\u0119dzy nimi, tworzymy relacyjn\u0105 baz\u0119 danych. T\u0119 integralno\u015b\u0107 danych opisuje si\u0119 skr\u00f3tem <strong>ACID<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Atomicity \u2013 Niepodzielno\u015b\u0107 transakcji<\/strong>. Jak sama nazwa wskazuje, dana transakcja ma si\u0119 wykona\u0107 w ca\u0142o\u015bci, lub w og\u00f3le. Przyk\u0142adem zastosowania b\u0119dzie np. transakcja bankowa, w kt\u00f3rej nie mo\u017ce doj\u015b\u0107 do sytuacji, w kt\u00f3rej pieni\u0105dze znikn\u0105 w czasie jej przetwarzania<\/li>\n\n\n\n<li><strong>Consistency \u2013 Sp\u00f3jno\u015b\u0107 transakcji<\/strong>. Po wykonaniu transakcji system ma pozosta\u0107 sp\u00f3jny, tj. spe\u0142nia\u0107 pewne zdefiniowane regu\u0142y<\/li>\n\n\n\n<li><strong>Isolation \u2013 Izolacja transakcji<\/strong>. Idealnym przyk\u0142adem izolacji transakcji b\u0119dzie pr\u00f3ba pobrania \u015brodk\u00f3w z jednego konta przez dwie osoby jednocze\u015bnie. Systemy zadbaj\u0105, aby (zale\u017cnie od konfiguracji) transakcje nie widzia\u0142y wprowadzanych przez siebie zmian. Najprawdopodobniej wykonaj\u0105 si\u0119 jedna po drugiej, a system zachowa si\u0119 zgodnie z jego obecnym stanem (np. pierwsza transakcja si\u0119 wykona, druga zostanie odrzucona poniewa\u017c obecny stan systemu wskazywa\u0142 na brak \u015brodk\u00f3w na koncie)<\/li>\n\n\n\n<li><strong>Durability \u2013 Trwa\u0142o\u015b\u0107<\/strong>. System potrafi uruchomi\u0107 si\u0119 i zaprezentowa\u0107 nienaruszone i aktualne dane.<\/li>\n<\/ul>\n\n\n\n<p>Zgodno\u015b\u0107 z <strong>ACID<\/strong> chroni integralno\u015b\u0107 danych, definiuj\u0105c dok\u0142adnie, czym jest transakcja i jak wsp\u00f3\u0142dzia\u0142a z baz\u0105 danych. Zapobiega to utracie synchronizacji tabel w bazie, co jest bardzo wa\u017cne w przypadku transakcji finansowych. Gwarantuje r\u00f3wnie\u017c wa\u017cno\u015b\u0107 transakcji nawet w obliczu b\u0142\u0119d\u00f3w, awarii technologii i katastrofalnych wydarze\u0144.<\/p>\n\n\n\n<p>Je\u015bli Twoje dane s\u0105 <strong>bardzo ustrukturyzowane<\/strong> i <strong>zgodno\u015b\u0107 z ACID<\/strong> jest konieczno\u015bci\u0105, <strong>SQL to \u015bwietny wyb\u00f3r<\/strong>. Z drugiej strony, je\u015bli Twoje <strong>wymagania dotycz\u0105ce danych nie s\u0105 jasne<\/strong> lub <strong>je\u015bli Twoje dane s\u0105 nieustrukturyzowane<\/strong>, <strong>NoSQL mo\u017ce by\u0107 najlepszym rozwi\u0105zaniem<\/strong>. W nieustannie rozwijaj\u0105cym si\u0119 \u015bwiecie, gdzie wymagane jest gromadzenie ogromnej ilo\u015bci nieprzetworzonych danych potrzebne by\u0142o rozwi\u0105zanie, kt\u00f3re b\u0119dzie w stanie wyj\u015b\u0107 poza ograniczenia obecnych modeli. Wobec tego klasyczne silniki coraz cz\u0119\u015bciej zast\u0119powane s\u0105 poprzez architektury rozproszone, kt\u00f3re zasilanie s\u0105 przez tzw. <strong>nierelacyjne bazy danych<\/strong>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Nierelacyjne bazy danych &#8211; NoSQL<\/strong><\/h2>\n\n\n\n<p>Je\u015bli <strong>SQL<\/strong> znaczy <strong>Structured Query Language,<\/strong> to czy&nbsp;<strong>NoSQL<\/strong> b\u0119dzie jego zaprzeczeniem?<\/p>\n\n\n\n<p>Po przeczytaniu tego akronimu wydawa\u0107 by si\u0119 mog\u0142o, \u017ce w tym podej\u015bciu nast\u0119puje ca\u0142kowite odej\u015bcie od tradycyjnego modelu. Sam termin zosta\u0142 po raz pierwszy u\u017cyty przez <strong>Carlo Strozziego<\/strong> dla jego open source\u2019owej wersji relacyjnej bazy danych <strong>Strozzi NoSQL<\/strong>. Sam skr\u00f3towiec NoSQL jest efektem wsp\u00f3\u0142pracy spo\u0142eczno\u015bci na kanale IRC #cassandra, kt\u00f3ra to w 2009 roku zosta\u0142a poproszona o pomys\u0142y na mo\u017cliwie najkr\u00f3tsz\u0105 nazw\u0119 nowego podej\u015bcia do baz danych. Tymczasem, bardziej ni\u017c &#8222;no SQL&#8221;, akronim oznacza &#8222;not only SQL&#8221; i w swoim za\u0142o\u017ceniu ma nie usuwa\u0107 relacyjnego modelu baz danych, a uzupe\u0142nia\u0107 go. Jednym z argument\u00f3w popieraj\u0105cych t\u0119 tez\u0119 jest chocia\u017cby fakt, \u017ce <strong>NoSQL<\/strong> <strong>dalej umo\u017cliwia obs\u0142ug\u0119 j\u0119zyka SQL&nbsp;<\/strong>(zale\u017cnie od wyboru rozwi\u0105zania). Obserwuj\u0105c trend powolnego odchodzenia od modelu relacyjnego, Strozzi sugeruje dodawa\u0107 do znaczenia dodatkowy skr\u00f3t <strong>NoREL<\/strong>. \u0141\u0105cz\u0105c te dwa skr\u00f3ty mo\u017cemy mie\u0107 wi\u0119c pe\u0142ny obraz, w jakim kierunku zmierza ten model baz danych. Z po\u0142\u0105czenia tych dw\u00f3ch termin\u00f3w wychodzi nam: <strong>not only REL, not only SQL<\/strong>.<\/p>\n\n\n\n<p>Sama potrzeba utworzenia takich baz danych pojawi\u0142a si\u0119 ju\u017c pod koniec lat 60. XX wieku, aby poradzi\u0107 sobie z problemem<strong> horyzontalnej skalowalno\u015bci do klastr\u00f3w maszyn<\/strong>. Innymi s\u0142owy \u2013 potrzebowali\u015bmy rozwi\u0105zania gotowego obs\u0142u\u017cy\u0107 struktury danych, do kt\u00f3rych stale dodaje si\u0119 nowe serwery (np. chmurowe). Innymi problemami, kt\u00f3re takie podej\u015bcie mia\u0142o zaadresowa\u0107 by\u0142y wci\u0105\u017c zwi\u0119kszaj\u0105ce si\u0119 ilo\u015bci wolumen\u00f3w danych, kt\u00f3re w pewnym momencie stanowi\u0142y powa\u017cne wyzwanie dla mniej wydajnych serwer\u00f3w.<\/p>\n\n\n\n<p>Na pocz\u0105tku XXI wieku nast\u0105pi\u0142 prawdziwy wybuch popularno\u015bci tego rozwi\u0105zania, kiedy to rosn\u0105cy giganci jak <strong>Google Inc.<\/strong> zbudowali swoj\u0105 wysoce skalowaln\u0105 przegl\u0105dark\u0119 Google i szereg aplikacji powi\u0105zanych jak Gmail, Google Maps, Google Earth. W rezultacie takie rozproszone systemy plik\u00f3w mog\u0142y w pe\u0142ni opiera\u0107 si\u0119 na strukturze NoSQL. Wspomnian\u0105 struktur\u0119 mo\u017cna opisa\u0107 jako cztery oddzielne typy baz danych:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Rodziny kolumn<\/strong> \u2013 odpowiedniki tabel w SQL zawieraj\u0105ce klucze-warto\u015bci jako jej rz\u0119dy<\/li>\n\n\n\n<li><strong>Bazy Dokument\u00f3w<\/strong> \u2013 w swoim za\u0142o\u017ceniu koduj\u0105ce dane do popularnych format\u00f3w takich jak: <strong>XML, JSON, YAML, <\/strong>lub <strong>BSON<\/strong> (dla warto\u015bci binarnych)<\/li>\n\n\n\n<li><strong>Grafy<\/strong> \u2013 wykresy ze sko\u0144czon\u0105 liczb\u0105 relacji mi\u0119dzy nimi<\/li>\n\n\n\n<li><strong>Bazy klucz-warto\u015b\u0107 (mapy\/s\u0142owniki)<\/strong> \u2013 metoda modelowania danych w formie <strong>map<\/strong> lub <strong>s\u0142ownik\u00f3w<\/strong>. Przechowuj\u0105 np. obrazy, dane sesji, zawarto\u015b\u0107 koszyka zakup\u00f3w.<\/li>\n<\/ul>\n\n\n\n<p>Dla por\u00f3wnania modelu nierelacyjnego z relacyjnym,w tym drugim modelu mamy tylko dwa typy baz danych: <strong>OLTP (On-Line Transactional Processing)<\/strong> oraz <strong>OLAP (On-Line Analytical Processing)<\/strong>.<\/p>\n\n\n\n<p>Co jednak cechuje NoSQL to fakt, \u017ce <strong>przechowywane dane nie wymagaj\u0105 predefiniowanego schematu<\/strong>, jak w przypadku bazy danych SQL. Podej\u015bcie to zapewnia znacznie wi\u0119ksz\u0105 szybko\u015b\u0107 niekt\u00f3rych operacji i pozwala na elastyczno\u015b\u0107 w planowaniu zarz\u0105dzania baz\u0105 danych. Nie budujemy czystych relacji, a gromadzimy, analizujemy i badamy korelacje mi\u0119dzy du\u017cymi ilo\u015bciami nieustrukturyzowanych danych. Odpowiedzialne s\u0105 za to <strong>dynamiczne schematy<\/strong>, kt\u00f3re zgodnie z za\u0142o\u017ceniami s\u0105 <strong>skalowalne horyzontalnie<\/strong>. Wobec tego wszelkie dane jakie trafiaj\u0105 do systemu mog\u0105 pozosta\u0107 nieustrukturyzowane i pozostawione do dalszej obr\u00f3bki. Dobrym przyk\u0142adem tego podej\u015bcia s\u0105 wsp\u00f3\u0142czesne media spo\u0142eczno\u015bciowe, w kt\u00f3rych profiluje si\u0119 dla nas reklamy, artyku\u0142y, wiadomo\u015bci, komentarze itd. To w\u0142a\u015bnie takie podej\u015bcie pozwala, poza sam\u0105 identyfikacj\u0105 u\u017cytkownika, sprofilowa\u0107 jego upodobania, prawdopodobie\u0144stwo nabycia danego produktu ale r\u00f3wnie\u017c przenie\u015b\u0107 go dok\u0142adnie w to samo miejsce, w kt\u00f3rym ostatnio sko\u0144czy\u0142 prac\u0119.<\/p>\n\n\n\n<p>Interakcja z baz\u0105 NoSQL r\u00f3\u017cni si\u0119 od tradycyjnego podej\u015bcia. Podczas przegl\u0105dania relacyjnej bazy danych u\u017cytkownik projektuje precyzyjne zapytania, kt\u00f3re p\u00f3\u017aniej s\u0105 w stanie odpyta\u0107 baz\u0119 i wy\u015bwietli\u0107 oczekiwane wyniki. W przypadku nierelacyjnej bazy danych s\u0105 to najcz\u0119\u015bciej <strong>\u017c\u0105dania wys\u0142ane za pomoc\u0105 API<\/strong>, a dane przekazywane s\u0105 w gotowych obiektach takich jak <strong>JSON, XML<\/strong> lub innych im podobnych. M\u00f3wi\u0105c w skr\u00f3cie \u2013 dane przekazywane s\u0105 wraz z ich kompletnym schematem.<\/p>\n\n\n\n<p><strong>NoSQL<\/strong> <strong>nie spe\u0142nia za\u0142o\u017ce\u0144 ACID<\/strong>, przez co opracowany musia\u0142 zosta\u0107 kompromis, kt\u00f3ry nazwano modelem <strong>BASE<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Basically Available<\/strong> \u2013 oznacza to, \u017ce chocia\u017c baza danych gwarantuje dost\u0119pno\u015b\u0107 danych, baza danych mo\u017ce nie uzyska\u0107 \u017c\u0105danych danych lub dane mog\u0105 by\u0107 w zmiennym lub niesp\u00f3jnym stanie<\/li>\n\n\n\n<li><strong>Soft State<\/strong> \u2013 stan bazy mo\u017ce zmieni\u0107 si\u0119 w czasie<\/li>\n\n\n\n<li><strong>Eventually Consistent<\/strong> \u2013 baza danych ostatecznie stanie si\u0119 sp\u00f3jna, a w przysz\u0142o\u015bci dane b\u0119d\u0105 rozpropagowane wsz\u0119dzie.<\/li>\n<\/ul>\n\n\n\n<p>Maj\u0105c wi\u0119c rozumienie na temat tych dw\u00f3ch podej\u015b\u0107, rozwa\u017cmy g\u0142\u00f3wne r\u00f3\u017cnice wyst\u0119puj\u0105ce mi\u0119dzy nimi.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">G\u0142\u00f3wne r\u00f3\u017cnice mi\u0119dzy SQL a NoSQL<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Wyszukiwanie danych<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>SQL<\/strong> to popularny j\u0119zyk programowania, kt\u00f3ry<strong> istnieje od ponad 45 lat, wi\u0119c jest ju\u017c bardzo rozwini\u0119ty i dobrze znany<\/strong>. Skutecznie wykonuje zapytania oraz szybko pobiera i edytuje dane. Jest bardzo lekki i deklaratywny, dzi\u0119ki czemu jest \u0142atwy do nauczenia. W zwi\u0105zku z tym zapytania nie wymagaj\u0105 mocno technicznego do\u015bwiadczenia<\/li>\n\n\n\n<li><strong>NoSQL<\/strong> zapewnia ogromn\u0105 elastyczno\u015b\u0107 w zakresie typ\u00f3w danych, kt\u00f3re mo\u017cna przechowywa\u0107, ale <strong>ze wzgl\u0119du na potencjalnie du\u017ce r\u00f3\u017cnice w strukturach danych zapytania nie s\u0105 tak wydajne, jak w przypadku bazy danych SQL<\/strong>. Podczas tworzenia technologii baz danych NoSQL programi\u015bci koncentrowali si\u0119 na skalowalno\u015bci i elastyczno\u015bci, a nie wydajno\u015bci zapyta\u0144. Aby wi\u0119c uruchamia\u0107 zapytania NoSQL, trzeba wykonywa\u0107 dodatkowe przetwarzanie danych. W zale\u017cno\u015bci od u\u017cywanej bazy danych NoSQL mo\u017ce by\u0107 konieczne zaimplementowanie pewnego poziomu <strong>MapReduce<\/strong>.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Skalowalno\u015b\u0107<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>SQL skaluje si\u0119 w pionie<\/strong>, co oznacza, \u017ce wymagane b\u0119dzie <strong>zwi\u0119kszenie pojemno\u015b\u0107 pojedynczego serwera<\/strong> (wymieniaj\u0105c procesor, pami\u0119\u0107 <strong>RAM<\/strong> lub dysk <strong>SSD<\/strong>), aby skalowa\u0107 baz\u0119 danych. Zosta\u0142y zaprojektowane do dzia\u0142ania na jednym serwerze w celu zachowania integralno\u015bci danych, wi\u0119c nie s\u0105 \u0142atwe do skalowania<\/li>\n\n\n\n<li><strong>NoSQL skaluje si\u0119 w poziomie<\/strong>, co oznacza, \u017ce mo\u017cesz doda\u0107 wi\u0119cej serwer\u00f3w, aby zasila\u0107 rosn\u0105c\u0105 baz\u0119 danych. <strong>Jest to ogromna przewaga, jak\u0105 NoSQL ma nad SQL<\/strong>. Zdolno\u015b\u0107 baz danych NoSQL do skalowania poziomego wi\u0105\u017ce si\u0119 z brakiem struktury danych. Poniewa\u017c NoSQL wymaga znacznie mniej struktury ni\u017c SQL, ka\u017cdy przechowywany obiekt jest prawie samowystarczalny i niezale\u017cny. W ten spos\u00f3b obiekty mo\u017cna \u0142atwo przechowywa\u0107 na wielu serwerach bez konieczno\u015bci \u0142\u0105czenia ich. Nie dotyczy to j\u0119zyka SQL, w kt\u00f3rym ka\u017cdy wiersz tabeli i kolumna musz\u0105 by\u0107 powi\u0105zane. Analogi\u0105 do skalowania w pionie i poziomie mo\u017ce by\u0107 tort weselny. Dzi\u0119ki SQL mo\u017cesz nakarmi\u0107 wi\u0119cej os\u00f3b, dodaj\u0105c wi\u0119cej warstw do tortu weselnego. W NoSQL\u2019u by\u0142by to \u201es\u0142odki st\u00f3\u0142\u201d z babeczkami weselnymi.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Schematy<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Schemat odnosi si\u0119 do planu bazy danych, czyli sposobu organizacji danych. Relacyjne bazy danych <strong>SQL s\u0105 lepsz\u0105 opcj\u0105 dla aplikacji, kt\u00f3re wymagaj\u0105 transakcji wielorz\u0119dowych<\/strong>, takich jak system ksi\u0119gowy lub dla starszych system\u00f3w, kt\u00f3re zosta\u0142y zbudowane dla struktury relacyjnej<\/li>\n\n\n\n<li><strong>Bazy danych NoSQL s\u0105 znacznie lepiej dostosowane do du\u017cych zbior\u00f3w danych<\/strong>, poniewa\u017c elastyczno\u015b\u0107 jest wa\u017cnym wymaganiem, kt\u00f3re spe\u0142nia ich dynamiczny schemat.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Kiedy u\u017cywa\u0107 SQL?<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>SQL jest naj\u0142atwiejszym j\u0119zykiem u\u017cywanym do komunikacji z <strong>RDBMS<\/strong><\/li>\n\n\n\n<li>W podej\u015bciu analitycznym umo\u017cliwia analizowanie trend\u00f3w behawioralnych i dostosowanie wynik\u00f3w do w\u0142asnych potrzeb<\/li>\n\n\n\n<li>Tworzenie niestandardowych pulpit\u00f3w nawigacyjnych, tzw. <strong>dashboard\u00f3w<\/strong><\/li>\n\n\n\n<li>Pozwala szybko przechowywa\u0107 i pobiera\u0107 dane z bazy danych<\/li>\n\n\n\n<li>Wybierany, kiedy chcemy u\u017cywa\u0107 funkcji <strong>JOIN<\/strong>&nbsp;i wykonywa\u0107 z\u0142o\u017cone zapytania.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Kiedy u\u017cywa\u0107 NoSQL?<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Gdy obs\u0142uga <strong>ACID<\/strong> nie jest potrzebna<\/li>\n\n\n\n<li>kiedy tradycyjny model <strong>RDBMS<\/strong> nie wystarczy<\/li>\n\n\n\n<li>Przy u\u017cyciu danych wymagaj\u0105cych elastycznego schematu<\/li>\n\n\n\n<li>Kiedy ograniczenia i walidacja nie musi by\u0107 implementowana w bazie danych<\/li>\n\n\n\n<li>Gdy wymagane jest pobranie danych z rozproszonych \u017ar\u00f3de\u0142<\/li>\n\n\n\n<li>Do przechowywania danych tymczasowych, takich jak koszyki, lista \u017cycze\u0144 i dane sesji.<\/li>\n<\/ul>\n\n\n\n<p>Podczas poszukiwania najlepszego rozwi\u0105zania nale\u017cy mie\u0107 na uwadze wady i zalety obydwu tych rozwi\u0105za\u0144. Mam jednak nadziej\u0119, \u017ce tak kompleksowe om\u00f3wienie tematu pomo\u017ce wam w dobraniu w\u0142a\u015bciwego dla siebie rozwi\u0105zania i rozbudzi wasz\u0105 ciekawo\u015b\u0107 do pog\u0142\u0119biania wiedzy z zakresu obydwu rozwi\u0105za\u0144. Jedno jest pewne \u2013 obydwa rozwi\u0105zania staj\u0105 si\u0119 niemal nieodzown\u0105 cz\u0119\u015bci\u0105 pracy testera oprogramowania. Warto wi\u0119c po\u015bwi\u0119ci\u0107 im troch\u0119 czasu.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>Chcesz lepiej zrozumie\u0107 aplikacje i systemy, kt\u00f3re testujesz? Do\u0142\u0105cz do ModernTester, poznaj najpotrzebniejsze narz\u0119dzia, frameworki oraz j\u0119zyki programowania i \u0107wicz na specjalnie przygotowanych \u015brodowiskach testowych: <a href=\"https:\/\/moderntester.sii.pl\/\" rel=\"nofollow\" >Platforma e-learningowa ModernTester<\/a><\/p>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-left kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;6066&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;8&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;4.5&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;11&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;4.5\\\/5 ( votes: 8)&quot;,&quot;size&quot;:&quot;18&quot;,&quot;title&quot;:&quot;Tabele i kolumny, czy mo\u017ce grafy, dokumenty i mapy, czyli jaki mamy wyb\u00f3r planuj\u0105c bazy danych?&quot;,&quot;width&quot;:&quot;125&quot;,&quot;_legend&quot;:&quot;{score}\\\/{best} ( {votes}: {count})&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 125px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 14.4px;\">\n            4.5\/5 ( votes: 8)    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>W dzisiejszych czasach zamkni\u0119cie si\u0119 w jednym modelu mo\u017ce okaza\u0107 si\u0119 niewystarczaj\u0105ce. Ju\u017c na etapie planowania projektu, warto rozwa\u017cy\u0107, jak &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/tabele-i-kolumny-czy-moze-grafy-dokumenty-i-mapy-czyli-jaki-mamy-wybor-planujac-bazy-danych\/\">Continued<\/a><\/p>\n","protected":false},"author":177,"featured_media":10364,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1317],"tags":[1020,1021,1011,1012,1010,1015,1017,1019,1008,1022,1014,1018,1007,1013,1016,1009],"class_list":["post-6066","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-testowanie","tag-acid","tag-base","tag-grafy","tag-klucz-wartosc","tag-kolumny","tag-nierelacyjne-bazy-danych","tag-non-relational","tag-norel","tag-nosql","tag-rdbms","tag-relacyjne-bazy-danych","tag-relational","tag-sql","tag-sqlvsnosql","tag-structured-query-language","tag-tabele"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/09\/SQL.jpg","category_names":["Testowanie"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/6066"}],"collection":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/users\/177"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=6066"}],"version-history":[{"count":2,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/6066\/revisions"}],"predecessor-version":[{"id":24864,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/6066\/revisions\/24864"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/10364"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=6066"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=6066"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=6066"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}