{"id":96465,"date":"2020-10-12T07:42:27","date_gmt":"2020-10-12T05:42:27","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/eta-baza-dannyh-v-ogne"},"modified":"2020-10-12T07:42:27","modified_gmt":"2020-10-12T05:42:27","slug":"eta-baza-dannyh-v-ogne","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/eta-baza-dannyh-v-ogne","title":{"rendered":"Ta baza danych p\u0142onie...","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Ta baza danych p\u0142onie...\" src=\"\/wp-content\/uploads\/2020\/10\/e4e39a7039dad14422fd83c05f114d6f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPozw\u00f3l, \u017ce opowiem techniczn\u0105 histori\u0119.<\/p>\n<p>Wiele lat temu stworzy\u0142em aplikacj\u0119 z wbudowanymi funkcjami wsp\u00f3\u0142pracy. By\u0142 to wygodny eksperymentalny stos, kt\u00f3ry w pe\u0142ni wykorzystywa\u0142 potencja\u0142 wczesnego React i CouchDB. Synchronizowa\u0142 dane w czasie rzeczywistym za pomoc\u0105 JSON. <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Operational_transformation\">OT<\/a><\/noindex>. By\u0142 u\u017cywany do wewn\u0119trznej pracy firmy, ale jego szeroka przydatno\u015b\u0107 i potencja\u0142 w innych dziedzinach by\u0142y oczywiste.<\/p>\n<p>Pr\u00f3buj\u0105c sprzeda\u0107 t\u0119 technologi\u0119 potencjalnym klientom, napotkali\u015bmy niespodziewan\u0105 przeszkod\u0119. W wideo demonstracyjnym nasza technologia wygl\u0105da\u0142a i dzia\u0142a\u0142a \u015bwietnie, tu nie by\u0142o problemu. Wideo pokazywa\u0142o dok\u0142adnie, jak to dzia\u0142a, i nic nie by\u0142o symulowane. Stworzyli\u015bmy i zakodowali\u015bmy realistyczny scenariusz u\u017cycia programu.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\n<img decoding=\"async\" alt=\"Ta baza danych p\u0142onie...\" src=\"\/wp-content\/uploads\/2020\/10\/ea517a6aee0b015dc4d7bad4e86af6f4.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nW rzeczywisto\u015bci to sta\u0142o si\u0119 problemem. Nasze demo dzia\u0142a\u0142o dok\u0142adnie tak, jak imitowa\u0142y dzia\u0142anie swoich aplikacji wszystkie inne programy. Konkretnie, informacja by\u0142a natychmiast przekazywana z A do B, nawet w przypadku du\u017cych plik\u00f3w multimedialnych. Po zalogowaniu ka\u017cdy u\u017cytkownik widzia\u0142 nowe wpisy. Dzi\u0119ki aplikacji r\u00f3\u017cni u\u017cytkownicy mogli wsp\u00f3\u0142pracowa\u0107 nad tymi samymi projektami, nawet w przypadku przerwanego po\u0142\u0105czenia internetowego gdzie\u015b na wsi. Niejasno to sugeruje ka\u017cde video produktu montowane w After Effects.<\/p>\n<p>Mimo \u017ce wszyscy wiedzieli, do czego potrzebny jest przycisk od\u015bwie\u017cania, nikt zupe\u0142nie nie rozumia\u0142, \u017ce aplikacje internetowe, kt\u00f3re prosz\u0105 nas o stworzenie, zazwyczaj maj\u0105 swoje ograniczenia. I \u017ce je\u015bli nie b\u0119d\u0105 ju\u017c potrzebne, do\u015bwiadczenie u\u017cytkownika b\u0119dzie zupe\u0142nie inne. Zasadniczo zauwa\u017cali, \u017ce mo\u017cna \"czatowa\u0107\", zostawiaj\u0105c notatki rozm\u00f3wcom, wi\u0119c zadawali sobie pytanie, czym to si\u0119 r\u00f3\u017cni na przyk\u0142ad od Slacka. Ufff!<\/p>\n<h2>Projekt codziennych synchronizacji<\/h2>\n<p>\nJe\u015bli masz ju\u017c do\u015bwiadczenie w tworzeniu oprogramowania, powinno ci\u0119 irytowa\u0107, \u017ce wi\u0119kszo\u015b\u0107 ludzi nie mo\u017ce po prostu spojrze\u0107 na obraz interfejsu i zrozumie\u0107, co on zrobi podczas interakcji z nim. Nie m\u00f3wi\u0105c ju\u017c o tym, co dzieje si\u0119 wewn\u0105trz samego programu. Wiedza o tym, \u017ce <i>mo\u017ce<\/i> zdarzy\u0107 si\u0119 \u2014 w du\u017cej mierze wynik wiedzy o tym, co nie mo\u017ce si\u0119 zdarzy\u0107 i co nie powinno si\u0119 zdarzy\u0107. Wymaga to <noindex><a rel=\"nofollow\" href=\"https:\/\/uxdesign.cc\/design-of-everyday-things-chapter-01-summary-and-keypoints-664d426a11e0\">modelu mentalnego<\/a><\/noindex> nie tylko tego, co robi oprogramowanie, ale tak\u017ce tego, jak s\u0105 ze sob\u0105 skoordynowane i komunikuj\u0105 si\u0119 jego poszczeg\u00f3lne cz\u0119\u015bci.<\/p>\n<p>Klasycznym przyk\u0142adem tego jest u\u017cytkownik, kt\u00f3ry przez dwadzie\u015bcia minut patrzy na <i>spinner.gif<\/i>, zastanawiaj\u0105c si\u0119, kiedy wreszcie zako\u0144czy si\u0119 operacja. Programista zrozumia\u0142by, \u017ce proces prawdopodobnie zawiesi\u0142 si\u0119 i \u017ce gif nigdy nie zniknie z ekranu. Ta animacja imituje post\u0119p pracy, ale nie ma zwi\u0105zku z jej stanem. W podobnych przypadkach niekt\u00f3rzy technicy lubi\u0105 przewraca\u0107 oczami, zaskoczeni stopniem z\u0142udzenia u\u017cytkownik\u00f3w. Ale zauwa\u017ccie, kto z nich wskazuje na obracaj\u0105ce si\u0119 zegary i m\u00f3wi, \u017ce tak naprawd\u0119 stoj\u0105 w miejscu?<\/p>\n<p><img decoding=\"async\" alt=\"Ta baza danych p\u0142onie...\" src=\"\/wp-content\/uploads\/2020\/10\/db67c48846549b272a367c0a37aec97b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nOto istota warto\u015bci rzeczywistego czasu. W dzisiejszych czasach bazy danych rzeczywistego czasu wci\u0105\u017c s\u0105 niezwykle rzadko u\u017cywane, a wiele os\u00f3b podchodzi do nich z podejrzliwo\u015bci\u0105. Wi\u0119kszo\u015b\u0107 takich baz danych aktywnie sk\u0142ania si\u0119 ku stylowi NoSQL, przez co zazwyczaj stosuje si\u0119 rozwi\u0105zania oparte na Mongo, o kt\u00f3rych lepiej zapomnie\u0107. Jednak dla mnie oznacza to komfort pracy z CouchDB, a tak\u017ce badanie projektowania struktur, kt\u00f3re b\u0119d\u0105 mog\u0142y by\u0107 zape\u0142niane danymi nie tylko przez jakiego\u015b biurokraty. My\u015bl\u0119, \u017ce wykorzystuj\u0119 sw\u00f3j czas bardziej efektywnie.<\/p>\n<p>Ale prawdziwym tematem tego postu jest to, z czego korzystam dzisiaj. Nie z mojego wyboru, a z powodu oboj\u0119tnej i \u015blepo stosowanej polityki korporacyjnej. Dlatego przedstawiam ca\u0142kowicie uczciwe i obiektywne por\u00f3wnanie dw\u00f3ch \u015bci\u015ble zwi\u0105zanych produkt\u00f3w do pracy z bazami danych rzeczywistego czasu Google.<\/p>\n<p><img decoding=\"async\" alt=\"Ta baza danych p\u0142onie...\" src=\"\/wp-content\/uploads\/2020\/10\/89432de9501b7667f8e187d14afc8897.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nW nazwach obu jest s\u0142owo Fire. Jedno wspominam z czu\u0142o\u015bci\u0105. Drugie to dla mnie inny rodzaj ognia. Nie \u015bpiesz\u0119 si\u0119, aby wymieni\u0107 ich nazwy, poniewa\u017c jak tylko to zrobi\u0119, napotkamy pierwszy wielki problem \u2014 z nazwami.<\/p>\n<p>Pierwszy nosi nazw\u0119 <i>Firebase Real-Time Database<\/i>, a drugi \u2014 <i>Firebase Cloud Firestore<\/i>. Obydwa s\u0105 produktami z <i>Firebase suite<\/i> Google. Ich API nosz\u0105 nazwy odpowiednio <code>firebase.database(\u2026)<\/code> i <code>firebase.firestore(\u2026)<\/code>.<\/p>\n<p>Tak si\u0119 sta\u0142o, poniewa\u017c <i>Real-Time Database<\/i> to po prostu oryginalny <i>Firebase<\/i> przed jego zakupem przez Google w 2014 roku. Nast\u0119pnie w Google postanowiono stworzy\u0107 jako produkt r\u00f3wnoleg\u0142y <i>kopi\u0119<\/i> Firebase oparta na big data firmy i nazwano j\u0105 Firestore z chmur\u0105. Mam nadziej\u0119, \u017ce jeszcze si\u0119 nie pogubili\u015bcie. Je\u015bli jednak si\u0119 pogubili\u015bcie, nie martwcie si\u0119, sam pisa\u0142em t\u0119 cz\u0119\u015b\u0107 artyku\u0142u dziesi\u0119\u0107 razy.<\/p>\n<p>Poniewa\u017c nale\u017cy wskaza\u0107 <i>Firebase<\/i> w pytaniu o Firebase i <i>Firestore<\/i> w pytaniu o Firebase, przynajmniej \u017ceby\u015bcie byli zrozumiani kilka lat temu na Stack Overflow.<\/p>\n<p>Gdyby istnia\u0142a nagroda za najgorsze nazewnictwo produkt\u00f3w oprogramowania, ten przypadek z pewno\u015bci\u0105 by\u0142by jednym z kandydat\u00f3w. Odleg\u0142o\u015b\u0107 Hammingowa mi\u0119dzy tymi nazwami jest tak ma\u0142a, \u017ce myli nawet do\u015bwiadczonych in\u017cynier\u00f3w, kt\u00f3rych palce pisz\u0105 jedn\u0105 nazw\u0119, podczas gdy umys\u0142 my\u015bli o innej. To s\u0105 plany, kt\u00f3re z hukiem si\u0119 nie powiod\u0142y, wymy\u015blone z najlepszymi zamiarami; spe\u0142ni\u0142y prorocze ostrze\u017cenie, \u017ce baza danych b\u0119dzie w ogniu. I wcale nie \u017cartuj\u0119. Osoba, kt\u00f3ra wymy\u015bli\u0142a taki schemat nazewnictwa, sta\u0142a si\u0119 przyczyn\u0105 krwi, potu i \u0142ez.<\/p>\n<p><img decoding=\"async\" alt=\"Ta baza danych p\u0142onie...\" src=\"\/wp-content\/uploads\/2020\/10\/b793ce183c5d0477c32c87f64bce5879.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>Zwyci\u0119stwo Pyrrusa<\/h2>\n<p>\nMo\u017cna by pomy\u015ble\u0107, \u017ce Firestore to <i>zamiennik<\/i> Firebase, jego nast\u0119pca nast\u0119pnej generacji, ale by\u0142oby to b\u0142\u0119dne przekonanie. Firestore zdecydowanie nie pasuje na rol\u0119 zamiennika Firebase. Wydaje si\u0119, \u017ce kto\u015b usun\u0105\u0142 z niego wszystko interesuj\u0105ce, a wi\u0119ksz\u0105 cz\u0119\u015b\u0107 pozosta\u0142ego pomiesza\u0142 na r\u00f3\u017cne sposoby.<\/p>\n<p>Jednak pobie\u017cne spojrzenie na dwa produkty mo\u017ce was zmyli\u0107: wydaje si\u0119, \u017ce robi\u0105 to samo, przez g\u0142\u00f3wnie te same API i nawet w tej samej sesji baz danych. R\u00f3\u017cnice s\u0105 ma\u0142o zauwa\u017calne i odkrywane tylko przy dok\u0142adnym por\u00f3wnawczym badaniu obszernej dokumentacji. Lub gdy pr\u00f3bujecie przenie\u015b\u0107 idealnie dzia\u0142aj\u0105cy kod na Firebase, aby dzia\u0142a\u0142 z Firestore. Ju\u017c wtedy dowiadujesz si\u0119, \u017ce interfejs bazy danych si\u0119 zapala, gdy tylko pr\u00f3bujesz wykona\u0107 przeci\u0105ganie myszk\u0105 w czasie rzeczywistym. Powtarzam, nie \u017cartuj\u0119.<\/p>\n<p>Klient Firebase jest grzeczny w tym sensie, \u017ce buforuje zmiany i wykonuje automatyczne powt\u00f3rzenia pr\u00f3b aktualizacji, w kt\u00f3rych priorytet maj\u0105 ostatnie operacje zapisu. Jednak Firestore ma ograniczenie do 1 operacji zapisu na dokument na u\u017cytkownika na sekund\u0119, a to ograniczenie jest narzucane przez serwer. Pracuj\u0105c z nim, musisz znale\u017a\u0107 spos\u00f3b na obej\u015bcie tego i wdro\u017cy\u0107 ogranicznik cz\u0119stotliwo\u015bci aktualizacji, nawet gdy pr\u00f3bujesz stworzy\u0107 w\u0142asn\u0105 aplikacj\u0119. Oznacza to, \u017ce Firestore to baza danych w czasie rzeczywistym bez klienta czasu rzeczywistego, kt\u00f3ra ukrywa si\u0119 za tym za pomoc\u0105 API.<\/p>\n<p>Na tym etapie zaczynamy dostrzega\u0107 pierwsze oznaki sensu istnienia Firestore. Mo\u017ce si\u0119 myl\u0119, ale podejrzewam, \u017ce kto\u015b wysoko w kierownictwie Google spojrza\u0142 po zakupie na Firebase i po prostu powiedzia\u0142: \u201eNie, Bo\u017ce, nie. To niedopuszczalne. Tylko nie pod moim przewodnictwem\u201d.<\/p>\n<p><img decoding=\"async\" alt=\"Ta baza danych p\u0142onie...\" src=\"\/wp-content\/uploads\/2020\/10\/fbb5ce5ff93b4e3a7bdcd12cce3bdd92.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nOn wyszed\u0142 ze swoich komnat i og\u0142osi\u0142:<\/p>\n<p><i>\u201eJeden du\u017cy dokument JSON? Nie. Podzielicie dane na oddzielne dokumenty, z kt\u00f3rych ka\u017cdy nie mo\u017ce przekracza\u0107 1 megabajta\u201d.<\/i><\/p>\n<p>Wygl\u0105da na to, \u017ce to ograniczenie nie przetrwa pierwszego starcia z jak\u0105kolwiek wystarczaj\u0105co zmotywowan\u0105 baz\u0105 u\u017cytkownik\u00f3w. Wiesz, \u017ce tak jest. U nas w pracy, na przyk\u0142ad, mamy ponad p\u00f3\u0142tora tysi\u0105ca prezentacji, co jest ca\u0142kowicie normalne.<\/p>\n<p>Przy takim ograniczeniu b\u0119dziesz musia\u0142 pogodzi\u0107 si\u0119 z faktem, \u017ce jeden \u201edokument\u201d w bazie danych nie b\u0119dzie przypomina\u0142 \u017cadnego obiektu, kt\u00f3ry u\u017cytkownik m\u00f3g\u0142by nazwa\u0107 dokumentem.<\/p>\n<p><i>\u201eTablice tablic, kt\u00f3re mog\u0105 rekurencyjnie zawiera\u0107 inne elementy? Nie. Tablice b\u0119d\u0105 zawiera\u0107 tylko obiekty lub liczby o sta\u0142ej d\u0142ugo\u015bci, zgodnie z zamys\u0142em Pana\u201d.<\/i><\/p>\n<p>Dlatego je\u015bli mia\u0142e\u015b nadziej\u0119 umie\u015bci\u0107 w swojej Firestore GeoJSON, to odkryjesz, \u017ce to niemo\u017cliwe. Nie dopuszcza si\u0119 niczego jednowymiarowego. Mam nadziej\u0119, \u017ce lubisz Base64 i\/lub JSON wewn\u0105trz JSON.<\/p>\n<p><i>\u201eImport i eksport JSON przez HTTP, narz\u0119dzia wiersza polece\u0144 lub panel administracyjny? Nie. Mo\u017cesz tylko eksportowa\u0107 i importowa\u0107 dane do Google Cloud Storage. Tak to si\u0119 teraz nazywa. A kiedy m\u00f3wi\u0119 \u201ety\u201d, odnosz\u0119 si\u0119 tylko do tych, kt\u00f3rzy maj\u0105 uprawnienia Project Owner. Wszyscy inni mog\u0105 p\u00f3j\u015b\u0107 i stworzy\u0107 zg\u0142oszenia.\u201d<\/i><\/p>\n<p>Jak wida\u0107, model danych FireBase jest \u0142atwy do opisania. Zawiera jeden ogromny dokument JSON, \u0142\u0105cz\u0105cy klucze JSON z \u015bcie\u017ckami URL. Je\u015bli zapiszesz za pomoc\u0105 <code>HTTP PUT<\/code> do <code>\/<\/code> FireBase nast\u0119puj\u0105co:<\/p>\n<pre><code class=\"json\">{\n  \"hello\": \"world\"\n}<\/code><\/pre>\n<p>\nWtedy <code>GET \/hello<\/code> zwr\u00f3ci <code>\"world\"<\/code>. W zasadzie dzia\u0142a to tak, jak si\u0119 spodziewasz. Kolekcja obiekt\u00f3w FireBase <code>\/my-collection\/:id<\/code> jest r\u00f3wnowa\u017cna s\u0142ownikowi JSON <code>{\"my-collection\": {...}}<\/code> na korzeniu, kt\u00f3rego zawarto\u015b\u0107 jest dost\u0119pna w <code>\/my-collection<\/code>:<\/p>\n<pre><code class=\"json\">{\n  \"id1\": {...object},\n  \"id2\": {...object},\n  \"id3\": {...object},\n  \/\/ ...\n}<\/code><\/pre>\n<p>\nDzia\u0142a to \u015bwietnie, je\u015bli ka\u017cde wstawienie ma ID bez kolizji, do czego w systemie istnieje standardowe rozwi\u0105zanie.<\/p>\n<p>Innymi s\u0142owy, baza danych jest w 100% zgodna z JSON (*) i doskonale dzia\u0142a z HTTP, na przyk\u0142ad z CouchDB. Jednak g\u0142\u00f3wnie u\u017cywasz jej przez API w czasie rzeczywistym, kt\u00f3re abstrahuje websockets, autoryzacj\u0119 i subskrypcje. Panel administracyjny ma obie mo\u017cliwo\u015bci, pozwalaj\u0105c na edytowanie w czasie rzeczywistym oraz import\/eksport JSON. Je\u015bli w swoim kodzie b\u0119dziesz si\u0119 tego trzyma\u0107, zdziwisz si\u0119, jak wiele specjalistycznego kodu zniknie, gdy zrozumiesz, \u017ce patch i diff JSON pozwalaj\u0105 rozwi\u0105za\u0107 90% rutynowych zada\u0144 zwi\u0105zanych z obs\u0142ug\u0105 stanu.<\/p>\n<p>Model danych Firestore przypomina JSON, ale r\u00f3\u017cni si\u0119 od niego w niekt\u00f3rych krytycznych aspektach. Ju\u017c wspomnia\u0142em o braku tablic wewn\u0105trz tablic. Model sub-kolekcji polega na tym, \u017ce s\u0105 one konceptami pierwszej klasy, oddzielnymi od zawieraj\u0105cego ich dokumentu JSON. Poniewa\u017c nie istnieje gotowa serializacja, aby uzyska\u0107 i zapisa\u0107 dane, wymagany jest specjalistyczny spos\u00f3b wykonania kodu. Aby obs\u0142ugiwa\u0107 w\u0142asne kolekcje, trzeba pisa\u0107 w\u0142asne skrypty i narz\u0119dzia. Panel administracyjny pozwala na wprowadzanie tylko niewielkich zmian w jednym polu na raz i nie ma mo\u017cliwo\u015bci importu\/eksportu.<\/p>\n<p>Przekszta\u0142cili baz\u0119 danych NoSQL w czasie rzeczywistym w woln\u0105 baz\u0119 danych nie-SQL z automatycznym \u0142\u0105czeniem i oddzieln\u0105 kolumn\u0105 nie-JSON. <i>Co\u015b w stylu GraftQL<\/i>.<\/p>\n<p><img decoding=\"async\" alt=\"Ta baza danych p\u0142onie...\" src=\"\/wp-content\/uploads\/2020\/10\/c6e842418996c96f1efa873774f35f44.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>Gor\u0105cy Java<\/h2>\n<p>\nJe\u015bli Firestore mia\u0142 sta\u0107 si\u0119 bardziej niezawodny i skalowalny, to ironia polega na tym, \u017ce przeci\u0119tny programista uzyska mniej niezawodne rozwi\u0105zanie ni\u017c wybieraj\u0105c FireBase \u201ez pude\u0142ka\u201d. Oprogramowanie, kt\u00f3rego potrzebuje Narzekaj\u0105cy Administrator Bazy Danych, wymaga takiego poziomu wysi\u0142ku i umiej\u0119tno\u015bci, \u017ce jest to po prostu nierealistyczne w niszy, w kt\u00f3rej powinien by\u0107 dobry produkt. To przypomina, jak HTML5 Canvas wcale nie jest zamiennikiem Flash, je\u015bli nie ma narz\u0119dzi deweloperskich i odtwarzacza. Co wi\u0119cej, Firestore ugrz\u0119z\u0142o w d\u0105\u017ceniu do czysto\u015bci danych i sterylnej walidacji, co po prostu nie odpowiada temu, jak przeci\u0119tny u\u017cytkownik biznesowy <i>lubi pracowa\u0107<\/i>: dla niego wszystko jest opcjonalne, poniewa\u017c do samego ko\u0144ca wszystko jest szkicem.<\/p>\n<p>G\u0142\u00f3wn\u0105 wad\u0105 FireBase jest to, \u017ce klient zosta\u0142 stworzony kilka lat przed czasem, jeszcze zanim wi\u0119kszo\u015b\u0107 deweloper\u00f3w internetowych dowiedzia\u0142a si\u0119 o niemutowalno\u015bci. Z tego powodu FireBase zak\u0142ada, \u017ce b\u0119dziesz zmienia\u0107 dane, a wi\u0119c nie korzysta z zalet zapewnianej przez u\u017cytkownika niemutowalno\u015bci. Ponadto nie wykorzystuje danych ponownie w przesy\u0142anych u\u017cytkownikowi zrzutach, co sprawia, \u017ce wykonanie r\u00f3\u017cnicy jest znacznie trudniejsze. Dla du\u017cych dokument\u00f3w jego mechanizm transakcji oparty na zmiennych r\u00f3\u017cnicach jest po prostu niewystarczaj\u0105cy. Ludzie, mamy ju\u017c <code>WeakMap<\/code> w JavaScript. To u\u0142atwia spraw\u0119.<\/p>\n<p>Je\u015bli nada si\u0119 danym odpowiedni kszta\u0142t i nie b\u0119d\u0105 zbyt rozbudowane, to problem ten mo\u017cna obej\u015b\u0107. Ale ciekawi mnie, czy FireBase by\u0142by znacznie bardziej interesuj\u0105cy, gdyby deweloperzy wydali naprawd\u0119 dobry interfejs API klienta, korzystaj\u0105cy z niemutowalno\u015bci w po\u0142\u0105czeniu z powa\u017cnymi praktycznymi poradami dotycz\u0105cymi struktury baz danych. Zamiast tego wydaje si\u0119, \u017ce pr\u00f3bowali naprawi\u0107 co\u015b, co nie jest zepsute, i od tego sta\u0142o si\u0119 gorzej.<\/p>\n<p>Nie znam ca\u0142ej logiki, kt\u00f3ra le\u017ca\u0142a u podstaw stworzenia Firestore. Rozwa\u017cania na temat motyw\u00f3w wewn\u0105trz czarnej skrzynki to tak\u017ce cz\u0119\u015b\u0107 rozrywki. Takie przeciwstawienie dw\u00f3ch niezwykle podobnych, ale niepor\u00f3wnywalnych baz danych zdarza si\u0119 do\u015b\u0107 rzadko. Jakby kto\u015b pomy\u015bla\u0142: <i>\u201eFirebase to po prostu funkcja, kt\u00f3r\u0105 mo\u017cemy emulowa\u0107 w Google Cloud\u201d<\/i>, ale jednocze\u015bnie jeszcze nie odkry\u0142 koncepcji okre\u015blenia wymaga\u0144 z rzeczywistego \u015bwiata ani tworzenia u\u017cytecznych rozwi\u0105za\u0144, kt\u00f3re spe\u0142niaj\u0105 wszystkie te wymagania. <i>\u201eNiech to rozwa\u017caj\u0105 programi\u015bci. Po prostu zr\u00f3bcie \u0142adny interfejs... A czy mo\u017cna doda\u0107 wi\u0119cej ognia?\u201d<\/i><\/p>\n<p>Rozumiem kilka rzeczy o strukturach danych. Widz\u0119 wyra\u017anie, \u017ce koncepcja \u201ewszystko w jednym du\u017cym drzewie JSON\u201d jest pr\u00f3b\u0105 abstrahowania z bazy danych jakiegokolwiek poczucia du\u017cej struktury. Oczekiwanie, \u017ce oprogramowanie po prostu poradzi sobie z jakimkolwiek w\u0105tpliwym fraktalem struktury danych \u2013 to po prostu szale\u0144stwo. Nawet nie musz\u0119 sobie wyobra\u017ca\u0107, jak \u017ale mo\u017ce by\u0107, przeprowadza\u0142em surowe audyty kodu i <i>widzia\u0142em rzeczy, o kt\u00f3rych wy, ludzie, nawet nie \u015bnili\u015bcie.<\/i>. Ale r\u00f3wnie\u017c wiem, jak wygl\u0105daj\u0105 dobre struktury, <noindex><a rel=\"nofollow\" href=\"https:\/\/acko.net\/blog\/apis-are-about-policy\">jak ich u\u017cywa\u0107<\/a><\/noindex> i <noindex><a rel=\"nofollow\" href=\"https:\/\/acko.net\/blog\/software-development-as-advanced-damage-control\/\">dlaczego jest to potrzebne<\/a><\/noindex>. Mog\u0119 sobie wyobrazi\u0107 \u015bwiat, w kt\u00f3rym Firestore wydawa\u0142by si\u0119 ca\u0142kiem logiczny, a ludzie, kt\u00f3rzy go stworzyli, uwa\u017caliby, \u017ce wykonali dobr\u0105 robot\u0119. Ale nie \u017cyjemy w tym \u015bwiecie.<\/p>\n<p>Wsparcie dla budowania zapyta\u0144 w FireBase jest z\u0142e wed\u0142ug jakichkolwiek standard\u00f3w, praktycznie go nie ma. Zdecydowanie wymaga poprawy lub przynajmniej przemy\u015blenia. Ale Firestore nie jest du\u017co lepsze, poniewa\u017c jest ograniczone do tych samych jednowymiarowych indeks\u00f3w, kt\u00f3re s\u0105 w prostym SQL. Je\u015bli potrzebujesz zapyta\u0144, kt\u00f3re ludzie wykonuj\u0105 z chaotycznymi danymi, potrzebny jest wyszukiwanie pe\u0142notekstowe, filtry na kilka przedzia\u0142\u00f3w i dowolnie ustalany przez u\u017cytkownika porz\u0105dek. Po dok\u0142adnym zbadaniu funkcje prostego SQL same w sobie s\u0105 zbyt ograniczone. Poza tym jedynymi zapytaniami SQL, kt\u00f3re ludzie mog\u0105 wykonywa\u0107 w produkcji, s\u0105 szybkie zapytania. B\u0119dziesz potrzebowa\u0107 specjalistycznego rozwi\u0105zania do indeksowania z przemy\u015blnymi strukturami danych. W przypadku wszystkiego innego przynajmniej powinno by\u0107 inkrementalne mapowanie-reduce lub co\u015b podobnego.<\/p>\n<p>Je\u015bli poszukasz informacji na ten temat w dokumentach Google, mam nadziej\u0119, \u017ce skieruj\u0105 ci\u0119 w stron\u0119 czego\u015b takiego jak BigTable i BigQuery. Niemniej wszystkie te rozwi\u0105zania towarzyszy tak du\u017ca ilo\u015b\u0107 g\u0119stego \u017cargonu korporacyjnego, \u017ce szybko wr\u00f3cisz z powrotem i zaczniesz szuka\u0107 czego\u015b innego.<\/p>\n<p>Ostatni\u0105 rzecz\u0105, kt\u00f3rej potrzebujesz w przypadku bazy danych w czasie rzeczywistym, jest co\u015b stworzonego przez ludzi i dla ludzi, pracuj\u0105cych na poziomie wynagrodzenia dla kierownictwa.<\/p>\n<p><i>(*) To \u017cart, nie ma takiego poj\u0119cia, jak <noindex><a rel=\"nofollow\" href=\"http:\/\/seriot.ch\/parsing_json.php\">kompatybilno\u015b\u0107 z JSON w 100%<\/a><\/noindex>.<\/i><\/p>\n<p><\/p>\n<h4>Reklama<\/h4>\n<p>\nSzukasz <noindex><a rel=\"nofollow\" href=\"https:\/\/vdsina.ru\/cloud-servers?partner=habr130\">VDS<\/a><\/noindex> serwera do debugowania projekt\u00f3w i ich hostowania? Z pewno\u015bci\u0105 jeste\u015b naszym klientem \ud83d\ude42 Rozliczenie dzienne za serwery w r\u00f3\u017cnych konfiguracjach, antyDDoS oraz licencje Windows s\u0105 ju\u017c wliczone w cen\u0119.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/vdsina.ru\/cloud-servers?partner=habr130\"><img decoding=\"async\" alt=\"Ta baza danych p\u0142onie...\" src=\"\/wp-content\/uploads\/2020\/10\/f1215924e9c1c41d00f7c71c6c569aa4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><br \/>\n<br \/>\u0179r\u00f3d\u0142o: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/vdsina\/blog\/522672\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u043e\u0437\u0432\u043e\u043b\u044c\u0442\u0435 \u043c\u043d\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0438\u0441\u0442\u043e\u0440\u0438\u044e. \u041c\u043d\u043e\u0433\u043e \u043b\u0435\u0442 \u043d\u0430\u0437\u0430\u0434 \u044f \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441\u043e \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u043c\u0438 \u0432 \u043d\u0435\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b. \u042d\u0442\u043e \u0431\u044b\u043b \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0442\u0435\u043a, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b \u0440\u0430\u043d\u043d\u0435\u0433\u043e React \u0438 CouchDB. \u041e\u043d \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e JSON OT. \u0415\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0432\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u0435 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438, \u043e\u0434\u043d\u0430\u043a\u043e \u0448\u0438\u0440\u043e\u043a\u0430\u044f \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u043e\u0441\u0442\u044c \u0438 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u0441\u0444\u0435\u0440\u0430\u0445 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":96466,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-96465","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u043e\u0437\u0432\u043e\u043b\u044c\u0442\u0435 \u043c\u043d\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0438\u0441\u0442\u043e\u0440\u0438\u044e. \u041c\u043d\u043e\u0433\u043e \u043b\u0435\u0442.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/eta-baza-dannyh-v-ogne\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u042d\u0442\u0430 \u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043e\u0433\u043d\u0435\u2026 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u043e\u0437\u0432\u043e\u043b\u044c\u0442\u0435 \u043c\u043d\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0438\u0441\u0442\u043e\u0440\u0438\u044e. \u041c\u043d\u043e\u0433\u043e \u043b\u0435\u0442.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/eta-baza-dannyh-v-ogne\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-10-12T05:42:27+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-10-12T05:42:27+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Ta baza danych jest w ogniu\u2026 | ProHoster","description":"Pozw\u00f3l, \u017ce opowiem techniczn\u0105 histori\u0119. Wiele lat.","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/eta-baza-dannyh-v-ogne","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pl_PL","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u042d\u0442\u0430 \u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043e\u0433\u043d\u0435\u2026 | ProHoster","og:description":"\u041f\u043e\u0437\u0432\u043e\u043b\u044c\u0442\u0435 \u043c\u043d\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0438\u0441\u0442\u043e\u0440\u0438\u044e. \u041c\u043d\u043e\u0433\u043e \u043b\u0435\u0442.","og:url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/eta-baza-dannyh-v-ogne","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-10-12T05:42:27+00:00","article:modified_time":"2020-10-12T05:42:27+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"96465","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 10:42:30","updated":"2022-09-29 13:02:04","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/96465","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=96465"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/96465\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/96466"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=96465"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=96465"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=96465"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}