{"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\/sk\/blog\/administrirovanie\/eta-baza-dannyh-v-ogne","title":{"rendered":"T\u00e1to datab\u00e1za hor\u00ed...","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"T\u00e1to datab\u00e1za hor\u00ed...\" src=\"\/wp-content\/uploads\/2020\/10\/e4e39a7039dad14422fd83c05f114d6f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDovo\u013ete mi rozpr\u00e1va\u0165 technick\u00fd pr\u00edbeh.<\/p>\n<p>Pred mnoh\u00fdmi rokmi som vyv\u00edjal aplik\u00e1ciu so zabudovan\u00fdmi funkciami spolupr\u00e1ce. Bol to praktick\u00fd experiment\u00e1lny stack, ktor\u00fd vyu\u017e\u00edval pln\u00fd potenci\u00e1l ran\u00e9ho Reactu a CouchDB. V re\u00e1lnom \u010dase synchronizoval \u00fadaje prostredn\u00edctvom JSON. <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Operational_transformation\">OT<\/a><\/noindex>. Pou\u017e\u00edval sa vo vn\u00fatornej pr\u00e1ci spolo\u010dnosti, ale \u0161irok\u00e1 pou\u017eite\u013enos\u0165 a potenci\u00e1l v in\u00fdch oblastiach boli zrejm\u00e9.<\/p>\n<p>Ke\u010f sme sa sna\u017eili pred\u00e1va\u0165 t\u00fato technol\u00f3giu potenci\u00e1lnym klientom, narazili sme na neo\u010dak\u00e1van\u00fa prek\u00e1\u017eku. V uk\u00e1\u017ekovom videu na\u0161a technol\u00f3gia vyzerala a fungovala skvele, tu neboli \u017eiadne probl\u00e9my. Video presne ukazovalo, ako to funguje, a ni\u010d nebolo simulovan\u00e9. Vymysleli sme a zak\u00f3dovali realistick\u00fd scen\u00e1r pou\u017eitia programu.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\n<img decoding=\"async\" alt=\"T\u00e1to datab\u00e1za hor\u00ed...\" src=\"\/wp-content\/uploads\/2020\/10\/ea517a6aee0b015dc4d7bad4e86af6f4.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nV skuto\u010dnosti to bola pr\u00e1ve t\u00e1to vec, ktor\u00e1 sa stala probl\u00e9mom. Na\u0161a uk\u00e1\u017eka fungovala presne tak, ako simulovali fungovanie svojich aplik\u00e1ci\u00ed v\u0161etci ostatn\u00ed. Konkr\u00e9tne, inform\u00e1cie sa okam\u017eite pren\u00e1\u0161ali z bodu A do bodu B, aj ke\u010f i\u0161lo o ve\u013ek\u00e9 medi\u00e1lne s\u00fabory. Po prihl\u00e1sen\u00ed ka\u017ed\u00fd pou\u017e\u00edvate\u013e videl nov\u00e9 z\u00e1znamy. Pomocou aplik\u00e1cie mohli r\u00f4zni pou\u017e\u00edvatelia spolo\u010dn\u011b pracova\u0165 jasne na t\u00fdch ist\u00fdch projektoch, aj v pr\u00edpade preru\u0161en\u00e9ho pripojenia na Internet niekde na vidieku. Tak\u00e9to nie\u010do implicitne nazna\u010duje ak\u00e9ko\u013evek video o produkte zostrihan\u00e9 v After Effects.<\/p>\n<p>Napriek tomu, \u017ee v\u0161etci vedeli, na \u010do sl\u00fa\u017ei tla\u010didlo Obnovi\u0165, nikto \u00faplne nech\u00e1pal, \u017ee webov\u00e9 aplik\u00e1cie, ktor\u00e9 n\u00e1s \u017eiadaj\u00fa o vytvorenie, s\u00fa zvy\u010dajne vystaven\u00e9 svojim obmedzeniam. A \u017ee ak u\u017e nie s\u00fa potrebn\u00e9, pou\u017e\u00edvate\u013esk\u00fd z\u00e1\u017eitok bude \u00faplne in\u00fd. V\u00e4\u010d\u0161inou si v\u0161imli, \u017ee sa d\u00e1 'chatova\u0165', zanech\u00e1vaj\u00fac ostatn\u00fdm pozn\u00e1mky, a tak sa p\u00fdtali, \u010d\u00edm je to odli\u0161n\u00e9 od Slacku. Uf!<\/p>\n<h2>Dizajn ka\u017edodennej synchroniz\u00e1cie<\/h2>\n<p>\nAk m\u00e1te u\u017e sk\u00fasenosti s v\u00fdvojom softv\u00e9ru, mali by v\u00e1s roz\u010du\u013eova\u0165 potreba pam\u00e4ta\u0165 si, \u017ee v\u00e4\u010d\u0161ina \u013eud\u00ed nem\u00f4\u017ee len tak pozrie\u0165 na obr\u00e1zok rozhrania a pochopi\u0165, \u010do bude robi\u0165 pri interakcii s n\u00edm. Nehovoriac o tom, \u010do sa deje vo vn\u00fatri samotn\u00e9ho programu. Vedie\u0165, \u010do <i>m\u00f4\u017ee<\/i> sa stane \u2014 je do ve\u013ekej miery v\u00fdsledkom vedomosti o tom, \u010do sa nem\u00f4\u017ee sta\u0165 a \u010do by sa nemalo sta\u0165. Na to je potrebn\u00e9 <noindex><a rel=\"nofollow\" href=\"https:\/\/uxdesign.cc\/design-of-everyday-things-chapter-01-summary-and-keypoints-664d426a11e0\">ment\u00e1lna model<\/a><\/noindex> nielen to, \u010do softv\u00e9r rob\u00ed, ale aj to, ako s\u00fa jeho jednotliv\u00e9 \u010dasti vz\u00e1jomne zladen\u00e9 a komunikuj\u00fa.<\/p>\n<p>Klasick\u00fdm pr\u00edkladom je pou\u017e\u00edvate\u013e, ktor\u00fd sa dvadsa\u0165 min\u00fat pozer\u00e1 na <i>spinner.gif<\/i>, prem\u00fd\u0161\u013eaj\u00fac, kedy sa pr\u00e1ca kone\u010dne skon\u010d\u00ed. V\u00fdvoj\u00e1r by pochopil, \u017ee proces pravdepodobne zamrzol a \u017ee gif nikdy nezmizne zo obrazovky. T\u00e1to anim\u00e1cia imituje vykon\u00e1vanie \u00falohy, av\u0161ak nie je spojen\u00e1 s jej stavom. V tak\u00fdchto pr\u00edpadoch niektor\u00ed technici radi zdv\u00edhaj\u00fa obo\u010die, ohromen\u00ed mierou neporozumenia pou\u017e\u00edvate\u013eov. Ale v\u0161imnite si, kto z nich ukazuje na to\u010diace sa hodiny a hovor\u00ed, \u017ee v skuto\u010dnosti stoj\u00ed na mieste?<\/p>\n<p><img decoding=\"async\" alt=\"T\u00e1to datab\u00e1za hor\u00ed...\" src=\"\/wp-content\/uploads\/2020\/10\/db67c48846549b272a367c0a37aec97b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nO to ide v hodnote re\u00e1lneho \u010dasu. Dnes sa datab\u00e1zy re\u00e1lneho \u010dasu st\u00e1le ve\u013emi zriedka pou\u017e\u00edvaj\u00fa a mnoh\u00ed ich pova\u017euj\u00fa za podozriv\u00e9. V\u00e4\u010d\u0161ina t\u00fdchto datab\u00e1z sa akt\u00edvne prikl\u00e1\u0148a k \u0161t\u00fdlu NoSQL, kv\u00f4li \u010domu sa zvy\u010dajne pou\u017e\u00edvaj\u00fa rie\u0161enia zalo\u017een\u00e9 na Mongo, na ktor\u00e9 by sa malo rad\u0161ej zabudn\u00fa\u0165. Pre m\u0148a to v\u0161ak znamen\u00e1 pohodlie pri pr\u00e1ci s CouchDB a tie\u017e \u0161t\u00fadium n\u00e1vrhu \u0161trukt\u00far, ktor\u00e9 bud\u00fa schopn\u00e9 plni\u0165 \u00fadaje nielen nejak\u00fdm byrokratick\u00fdm pracovn\u00edkom. Mysl\u00edm, \u017ee svoj \u010das investujem efekt\u00edvnej\u0161ie.<\/p>\n<p>Ale pravdivou t\u00e9mou tohto pr\u00edspevku je to, \u010do pou\u017e\u00edvam dnes. Nie z vlastn\u00e9ho v\u00fdberu, ale kv\u00f4li \u013eahostajne a slepo praktizovanej firemnej politike. Preto poskytnem \u00daplne \u010cestn\u00e9 a Nezaujat\u00e9 porovnanie dvoch tesne s\u00favisiacich produktov na pr\u00e1cu s datab\u00e1zami re\u00e1lneho \u010dasu od Google.<\/p>\n<p><img decoding=\"async\" alt=\"T\u00e1to datab\u00e1za hor\u00ed...\" src=\"\/wp-content\/uploads\/2020\/10\/89432de9501b7667f8e187d14afc8897.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nV n\u00e1zvoch oboch je slovo Fire. Jeden si pam\u00e4t\u00e1m s l\u00e1skou. Druh\u00fd pre m\u0148a predstavuje in\u00fd druh oh\u0148a. Nepospech\u00e1m si s ich n\u00e1zvami, preto\u017ee akon\u00e1hle to urob\u00edm, stretneme sa s prv\u00fdm ve\u013ek\u00fdm probl\u00e9mom \u2013 menami.<\/p>\n<p>Prv\u00fd sa naz\u00fdva <i>Firebase Real-Time Database<\/i>, a druh\u00fd \u2013 <i>Firebase Cloud Firestore<\/i>. Obe s\u00fa produktmi z <i>Firebase suite<\/i> Google. Ich API sa naz\u00fdvaj\u00fa, pr\u00edslu\u0161ne, <code>firebase.database(\u2026)<\/code> a <code>firebase.firestore(\u2026)<\/code>.<\/p>\n<p>Stalo sa to preto, \u017ee <i>Real-Time Database<\/i> \u2013 je to jednoducho p\u00f4vodn\u00fd <i>Firebase<\/i> pred jeho akviz\u00edciou Google v roku 2014. Potom sa v Google rozhodli vytvori\u0165 ako paraleln\u00fd produkt <i>k\u00f3piu<\/i> Firebase zalo\u017een\u00fa na big data spolo\u010dnosti, a nazvali ju Firestore with a cloud. D\u00fafam, \u017ee ste sa e\u0161te nezamotali. Ak sa predsa len zamotali, nebojte sa, s\u00e1m som t\u00fato \u010das\u0165 \u010dl\u00e1nku prepisoval desa\u0165kr\u00e1t.<\/p>\n<p>Preto\u017ee je potrebn\u00e9 uvies\u0165 <i>Firebase<\/i> v ot\u00e1zke o Firebase, a <i>Firestore<\/i> v ot\u00e1zke o Firebase, aspo\u0148 aby v\u00e1s pochopili pred nieko\u013ek\u00fdmi rokmi na Stack Overflow.<\/p>\n<p>Keby existovala cena za najhor\u0161ie pomenovanie softv\u00e9rov\u00fdch produktov, tento pr\u00edpad by ur\u010dite bol jedn\u00fdm z kandid\u00e1tov. Hammingova vzdialenos\u0165 medzi t\u00fdmito n\u00e1zvami je tak mal\u00e1, \u017ee m\u00e4tie aj sk\u00fasen\u00fdch in\u017einierov, ktor\u00fdch prsty p\u00ed\u0161u jedno meno, hoci hlava mysl\u00ed na in\u00e9. Tieto pl\u00e1ny s ve\u013ek\u00fdm roz\u010darovan\u00edm skrachovali, boli vymyslen\u00e9 s najlep\u0161\u00edmi \u00famyslami; naplnili proroctvo, \u017ee datab\u00e1za bude v plame\u0148och. A v\u00f4bec si nerob\u00edm \u017earty. \u010clovek, ktor\u00fd vymyslel tak\u00fato sch\u00e9mu pomenovania, bol pr\u00ed\u010dinou krvi, potu a s\u013az.<\/p>\n<p><img decoding=\"async\" alt=\"T\u00e1to datab\u00e1za hor\u00ed...\" src=\"\/wp-content\/uploads\/2020\/10\/b793ce183c5d0477c32c87f64bce5879.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>Pyrrhova v\u00ed\u0165azstvo<\/h2>\n<p>\nMohli by ste si myslie\u0165, \u017ee Firestore je <i>nahrada<\/i> Firebase, jeho n\u00e1stupca \u010fal\u0161ej gener\u00e1cie, ale to by bola omyl. Firestore ur\u010dite nie je vhodn\u00fd na to, aby nahradil Firebase. Zd\u00e1 sa, \u017ee niekto z neho vytrhol v\u0161etko zauj\u00edmav\u00e9 a v\u00e4\u010d\u0161inu zost\u00e1vaj\u00faceho zamie\u0148al r\u00f4znymi sp\u00f4sobmi.<\/p>\n<p>Napriek tomu r\u00fdchly poh\u013ead na tieto dva produkty m\u00f4\u017ee zmias\u0165: zd\u00e1 sa, \u017ee robia to ist\u00e9, cez v\u00e4\u010d\u0161inou rovnak\u00e9 API a dokonca v rovnakej datab\u00e1zovej rel\u00e1cii. Rozdiely s\u00fa takmer nevidite\u013en\u00e9 a odkryj\u00fa sa iba pri d\u00f4kladnom porovnan\u00ed rozsiahlej dokument\u00e1cie. Alebo ke\u010f sa pok\u00fa\u0161ate portova\u0165 perfektne funguj\u00faci k\u00f3d na Firebase, aby fungoval s Firestore. U\u017e vtedy zist\u00edte, \u017ee rozhranie datab\u00e1zy sa zapne, hne\u010f ako sa pok\u00fasite vykona\u0165 \u0165ahanie my\u0161ou v re\u00e1lnom \u010dase. Opakujem, nem\u00e1m \u017eart.<\/p>\n<p>Klient Firebase je zdvoril\u00fd v tom zmysle, \u017ee vyrovn\u00e1va zmeny a vykon\u00e1va automatick\u00e9 pokusy o op\u00e4tovn\u00e9 obnovenie, pri\u010dom prioritu dost\u00e1va posledn\u00e1 z\u00e1pisov\u00e1 oper\u00e1cia. Av\u0161ak Firestore m\u00e1 obmedzenie na 1 z\u00e1pisov\u00fa oper\u00e1ciu na dokument na pou\u017e\u00edvate\u013ea za sekundu, a toto obmedzenie je uvalen\u00e9 serverom. Pri pr\u00e1ci s n\u00edm sa mus\u00edte sami postara\u0165 o obch\u00e1dzanie tohto obmedzenia a implement\u00e1ciu obmedzova\u010da frekvencie aktualiz\u00e1ci\u00ed, aj ke\u010f len sk\u00fa\u0161ate vytvori\u0165 svoju aplik\u00e1ciu. To znamen\u00e1, \u017ee Firestore je datab\u00e1za v re\u00e1lnom \u010dase bez klienta v re\u00e1lnom \u010dase, ktor\u00fd sa maskuje ako tak\u00e1 pomocou API.<\/p>\n<p>Na tomto miest\u011b za\u010d\u00edname vidie\u0165 prv\u00e9 znaky zmyslu existencie Firestore. Mo\u017eno sa m\u00fdlim, ale m\u00e1m podozrenie, \u017ee niekto vysoko v veden\u00ed Google sa po k\u00fape Firebase pozrel a jednoducho povedal: \u201eNie, bo\u017ee, nie. To je neprijate\u013en\u00e9. Len nie pod moj\u00edm veden\u00edm.\u201c<\/p>\n<p><img decoding=\"async\" alt=\"T\u00e1to datab\u00e1za hor\u00ed...\" src=\"\/wp-content\/uploads\/2020\/10\/fbb5ce5ff93b4e3a7bdcd12cce3bdd92.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nObjavil sa zo svojich komn\u00e1t a vyhl\u00e1sil:<\/p>\n<p><i>\u201eJeden ve\u013ek\u00fd dokument JSON? Nie. Rozdel\u00edte d\u00e1ta na samostatn\u00e9 dokumenty, ka\u017ed\u00fd z nich bude ma\u0165 maxim\u00e1lnu ve\u013ekos\u0165 1 megabajt.\u201c<\/i><\/p>\n<p>Zd\u00e1 sa, \u017ee tak\u00e9to obmedzenie nepre\u017eije prv\u00e9 stretutie s akouko\u013evek dostato\u010dne motivovanou pou\u017e\u00edvate\u013eskou z\u00e1klad\u0148ou. Viete, \u017ee je to tak. Napr\u00edklad v na\u0161ej pr\u00e1ci m\u00e1me viac ako tis\u00edc p\u00e4\u0165sto prezent\u00e1ci\u00ed a to je \u00faplne norm\u00e1lne.<\/p>\n<p>S tak\u00fdmto obmedzen\u00edm sa budete musie\u0165 zmieri\u0165 s faktom, \u017ee jeden \u201edokument\u201c v datab\u00e1ze nebude vyzera\u0165 ako \u017eiadny objekt, ktor\u00fd by pou\u017e\u00edvate\u013e mohol nazva\u0165 dokumentom.<\/p>\n<p><i>\u201ePolia pol\u00ed, ktor\u00e9 m\u00f4\u017eu rekurz\u00edvne obsahova\u0165 in\u00e9 prvky? Nie. Polia bud\u00fa obsahova\u0165 iba objekty alebo \u010d\u00edsla fixnej d\u013a\u017eky, ako to zam\u00fd\u0161\u013eal P\u00e1n.\u201c<\/i><\/p>\n<p>Ak ste teda d\u00fafali, \u017ee umiestnite do svojej Firestore GeoJSON, objav\u00edte, \u017ee je to nemo\u017en\u00e9. Nedovol\u00ed sa ni\u010d jednorozmern\u00e9. D\u00fafam, \u017ee m\u00e1te radi Base64 a\/alebo JSON v JSON.<\/p>\n<p><i>\u201eImport a export JSON cez HTTP, n\u00e1stroje pr\u00edkazov\u00e9ho riadku alebo administra\u010dn\u00e1 konzola? Nie. M\u00f4\u017eete iba exportova\u0165 a importova\u0165 d\u00e1ta do Google Cloud Storage. Tak sa zd\u00e1, \u017ee sa to teraz naz\u00fdva. A ke\u010f hovor\u00edm 'vy', mysl\u00edm iba na t\u00fdch, ktor\u00ed maj\u00fa opr\u00e1vnenia Project Owner. Ostatn\u00ed m\u00f4\u017eu \u00eds\u0165 vytvori\u0165 l\u00edstok.\u201c<\/i><\/p>\n<p>Ako vid\u00edte, model d\u00e1t FireBase je \u013eahko op\u00edsate\u013en\u00fd. Obsahuje jeden obrovsk\u00fd dokument JSON, ktor\u00fd sp\u00e1ja k\u013e\u00fa\u010de JSON s URL cestami. Ak zap\u00ed\u0161ete pomocou <code>HTTP PUT<\/code> v <code>\/<\/code> FireBase nasleduj\u00face:<\/p>\n<pre><code class=\"json\">{\n  \"hello\": \"svet\"\n}<\/code><\/pre>\n<p>\nPotom <code>GET \/hello<\/code> vr\u00e1ti <code>\"svet\"<\/code>Vo v\u00e4\u010d\u0161ine to funguje presne tak, ako o\u010dak\u00e1vate. Kolekcia objektov FireBase <code>\/my-collection\/:id<\/code> je ekvivalentn\u00e1 slovn\u00edku JSON <code>{\"my-collection\": {...}}<\/code> v kore\u0148ovom adres\u00e1ri, obsah ktor\u00e9ho je dostupn\u00fd v <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>\nTo funguje skvele, ak m\u00e1 ka\u017ed\u00fd vlo\u017een\u00fd z\u00e1znam ID bez kol\u00edzi\u00ed, na \u010do m\u00e1 syst\u00e9m \u0161tandardn\u00e9 rie\u0161enie.<\/p>\n<p>In\u00fdmi slovami, datab\u00e1za je 100% kompatibiln\u00e1 s JSON (*) a skvele funguje s HTTP, napr\u00edklad s CouchDB. V\u00e4\u010d\u0161inou ju v\u0161ak pou\u017e\u00edvate prostredn\u00edctvom API v re\u00e1lnom \u010dase, ktor\u00e9 abstrahuje websockets, autoriz\u00e1ciu a predplatn\u00e9. Administra\u010dn\u00e1 konzola m\u00e1 obe mo\u017enosti, \u010do umo\u017e\u0148uje vykon\u00e1va\u0165 \u00fapravy v re\u00e1lnom \u010dase a importova\u0165\/exportova\u0165 JSON. Ak sa vo svojom k\u00f3de budete dr\u017ea\u0165 toho ist\u00e9ho, prekvap\u00ed v\u00e1s, ak\u00e9 mno\u017estvo \u0161pecializovan\u00e9ho k\u00f3du zmizne, ke\u010f pochop\u00edte, \u017ee patch a diff JSON umo\u017e\u0148uj\u00fa vyrie\u0161i\u0165 90% rutinn\u00fdch \u00faloh pri spr\u00e1ve st\u00e1lych stavov.<\/p>\n<p>Model d\u00e1t Firestore je podobn\u00fd JSON, ale v niektor\u00fdch kritick\u00fdch aspektoch sa od neho l\u00ed\u0161i. U\u017e som spom\u00ednal absenciu pol\u00ed vo vn\u00fatri pol\u00ed. Model sub-collections spo\u010d\u00edva v tom, \u017ee s\u00fa to koncepty prvej triedy, oddelen\u00e9 od dokumentu JSON, ktor\u00fd ich obsahuje. Preto\u017ee neexistuje pripraven\u00e1 serializ\u00e1cia, na z\u00edskanie a z\u00e1pis d\u00e1t je potrebn\u00fd \u0161pecializovan\u00fd sp\u00f4sob vykon\u00e1vania k\u00f3du. Na spracovanie vlastn\u00fdch kolekci\u00ed je potrebn\u00e9 p\u00edsa\u0165 vlastn\u00e9 skripty a n\u00e1stroje. Administra\u010dn\u00e1 konzola v\u00e1m umo\u017e\u0148uje vykona\u0165 iba mal\u00e9 zmeny po jednom poli naraz a nem\u00e1 mo\u017enosti importu\/exportu.<\/p>\n<p>Vzali datab\u00e1zu NoSQL v re\u00e1lnom \u010dase a premenili ju na pomal\u00fa ne-SQL s automatick\u00fdm zl\u00fa\u010den\u00edm a oddelen\u00fdm st\u013apcom ne-JSON. <i>Nie\u010do ako GraftQL<\/i>.<\/p>\n<p><img decoding=\"async\" alt=\"T\u00e1to datab\u00e1za hor\u00ed...\" src=\"\/wp-content\/uploads\/2020\/10\/c6e842418996c96f1efa873774f35f44.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>Hot Java<\/h2>\n<p>\nAk mal by\u0165 Firestore spo\u013eahlivej\u0161\u00ed a \u0161k\u00e1lovate\u013enej\u0161\u00ed, ir\u00f3nia spo\u010d\u00edva v tom, \u017ee priemern\u00fd v\u00fdvoj\u00e1r z\u00edska menej spo\u013eahliv\u00e9 rie\u0161enie ako pri v\u00fdbere FireBase \u201ez krabice\u201c. Softv\u00e9r, ktor\u00fd potrebuje Mrzut\u00fd Administr\u00e1tor Datab\u00e1zy, si vy\u017eaduje tak\u00fa \u00farove\u0148 \u00fasilia a kalibr\u00e1cie odborn\u00edkov, \u017ee je to jednoducho nerealistick\u00e9 pre oblas\u0165, kde by mal by\u0165 dobr\u00fd produkt. Je to podobn\u00e9 ako fakt, \u017ee HTML5 Canvas nie je n\u00e1hradou za Flash, ak neexistuj\u00fa n\u00e1stroje na v\u00fdvoj a prehr\u00e1va\u010d. Navy\u0161e, Firestore sa ut\u00e1pa v snahe o \u010distotu d\u00e1t a steriln\u00fa valid\u00e1ciu, \u010do jednoducho nezodpoved\u00e1 tomu, ako priemern\u00fd obchodn\u00fd pou\u017e\u00edvate\u013e <i>r\u00e1d pracuje<\/i>: pre neho ni\u010d nemus\u00ed by\u0165 dokonal\u00e9, preto\u017ee na konci v\u0161etko je len koncept.<\/p>\n<p>Hlavnou nev\u00fdhodou FireBase je to, \u017ee klient bol vytvoren\u00fd o nieko\u013eko rokov sk\u00f4r, ne\u017e mal, e\u0161te pred t\u00fdm, ako v\u00e4\u010d\u0161ina webov\u00fdch v\u00fdvoj\u00e1rov poznala imutabilitu. Z tohto d\u00f4vodu FireBase predpoklad\u00e1, \u017ee budete meni\u0165 d\u00e1ta, a preto nevyu\u017e\u00edva v\u00fdhody zabezpe\u010dovanej imutability. Okrem toho nevyu\u017e\u00edva d\u00e1ta opakovane v odoslan\u00fdch sn\u00edmkach pre pou\u017e\u00edvate\u013ea, \u010do znemo\u017e\u0148uje jednoduch\u00e9 vykon\u00e1vanie porovnan\u00ed. Pre ve\u013ek\u00e9 dokumenty je jeho mechanizmus transakci\u00ed zalo\u017een\u00fd na menite\u013en\u00fdch rozdieloch jednoducho nedostato\u010dn\u00fd. Chlapci, u\u017e m\u00e1me <code>WeakMap<\/code> v JavaScripte. To je pohodln\u00e9.<\/p>\n<p>Ak d\u00e1te d\u00e1tam spr\u00e1vny tvar a nepovytiahnete stromy pr\u00edli\u0161 ve\u013ek\u00e9, m\u00f4\u017eete tento probl\u00e9m ob\u00eds\u0165. Ale zauj\u00edma ma, \u010di by FireBase bol ove\u013ea zauj\u00edmavej\u0161\u00ed, keby v\u00fdvoj\u00e1ri vydali skuto\u010dne dobr\u00e9 klientsk\u00e9 API, ktor\u00e9 by vyu\u017e\u00edvalo imutabilitu v kombin\u00e1cii so seri\u00f3znymi praktick\u00fdmi radami o \u0161trukt\u00fare datab\u00e1z. Namiesto toho sa zd\u00e1, \u017ee sa pok\u00fasili opravi\u0165 nie\u010do, \u010do nie je rozbit\u00e9, a od toho sa to zhor\u0161ilo.<\/p>\n<p>Neviem v\u0161etku logiku, ktor\u00e1 st\u00e1la za vytvoren\u00edm Firestore. Rozpr\u00e1vanie o motiv\u00e1ci\u00e1ch, ktor\u00e9 vznikaj\u00fa vo vn\u00fatri \u010diernej skrinky, je tie\u017e \u010das\u0165ou z\u00e1bavy. Tak\u00e9to postavenie dvoch mimoriadne podobn\u00fdch, ale nesrovnate\u013en\u00fdch datab\u00e1z sa vyskytuje dos\u0165 zriedka. Ako keby si niekto pomyslel: <i>\u201eFirebase je len funkcia, ktor\u00fa m\u00f4\u017eeme emulova\u0165 v Google Cloud\u201c<\/i>, ale pritom e\u0161te neotvoril koncept definovania po\u017eiadaviek re\u00e1lneho sveta alebo vytv\u00e1rania u\u017eito\u010dn\u00fdch rie\u0161en\u00ed, ktor\u00e9 by sp\u013a\u0148ali v\u0161etky tieto po\u017eiadavky. <i>\u201eNech o tom rozm\u00fd\u0161\u013eaj\u00fa v\u00fdvoj\u00e1ri. Sta\u010d\u00ed spravi\u0165 u\u017e\u00edvate\u013esk\u00e9 rozhranie pekn\u00e9... A m\u00f4\u017eem prida\u0165 viac oh\u0148a?\u201c<\/i><\/p>\n<p>Ch\u00e1pem p\u00e1r vec\u00ed o d\u00e1tov\u00fdch \u0161trukt\u00farach. Ur\u010dite vid\u00edm, \u017ee koncept \u201ev\u0161etko v jednom ve\u013ekom strome JSON\u201c je pokusom abstrahova\u0165 z datab\u00e1zy ak\u00fdko\u013evek pocit ve\u013ekorozmernej \u0161trukt\u00fary. O\u010dak\u00e1va\u0165, \u017ee softv\u00e9r sa jednoducho vyrovn\u00e1 ak\u00e9muko\u013evek pochybn\u00e9mu frakt\u00e1lu d\u00e1tovej \u0161trukt\u00fary, je jednoducho \u0161ialen\u00e9. Ani si nemus\u00edm predstavova\u0165, ako zl\u00e9 to m\u00f4\u017ee by\u0165, robil som pr\u00edsne audity k\u00f3du a <i>videl som nie\u010do, \u010do si ani vy, \u013eudia, neviete predstavi\u0165.<\/i>. Ale tie\u017e viem, ako vyzeraj\u00fa dobr\u00e9 \u0161trukt\u00fary, <noindex><a rel=\"nofollow\" href=\"https:\/\/acko.net\/blog\/apis-are-about-policy\">ako ich pou\u017e\u00edva\u0165<\/a><\/noindex> a <noindex><a rel=\"nofollow\" href=\"https:\/\/acko.net\/blog\/software-development-as-advanced-damage-control\/\">pre\u010do to treba robi\u0165.<\/a><\/noindex>M\u00f4\u017eem si predstavi\u0165 svet, v ktorom by Firestore p\u00f4sobila celkom logicky a t\u00ed, ktor\u00ed ju vytvorili, by si mysleli, \u017ee odvedli dobr\u00fa pr\u00e1cu. Ale ne\u017eijeme v tomto svete.<\/p>\n<p>Podpora pre vytv\u00e1ranie dotazov vo FireBase je zl\u00e1 pod\u013ea ak\u00fdchko\u013evek \u0161tandardov, prakticky neexistuje. Ur\u010dite si vy\u017eaduje zlep\u0161enie alebo aspo\u0148 prehodnotenie. Ale Firestore nie je o ve\u013ea lep\u0161ia, preto\u017ee je obmedzen\u00e1 rovnak\u00fdmi jednorozmern\u00fdmi indexmi, ak\u00e9 m\u00e1 jednoduch\u00e9 SQL. Ak potrebujete dotazy, ktor\u00e9 \u013eudia vykon\u00e1vaj\u00fa s chaotick\u00fdmi d\u00e1tami, potrebujete fulltextov\u00e9 vyh\u013ead\u00e1vanie, filtre na nieko\u013eko rozsahov a \u013eubovo\u013en\u00e9 poradie ur\u010den\u00e9 pou\u017e\u00edvate\u013eom. Pri bli\u017e\u0161om presk\u00faman\u00ed s\u00fa funkcie jednoduch\u00e9ho SQL samy o sebe pr\u00edli\u0161 obmedzen\u00e9. Okrem toho s\u00fa jedin\u00e9 SQL dotazy, ktor\u00e9 \u013eudia m\u00f4\u017eu vykon\u00e1va\u0165 v produkcii \u2014 r\u00fdchle dotazy. Na to budete potrebova\u0165 \u0161pecializovan\u00e9 rie\u0161enie na indexovanie s premyslen\u00fdmi d\u00e1tov\u00fdmi \u0161trukt\u00farami. Pre v\u0161etko ostatn\u00e9 by malo by\u0165 minim\u00e1lne inkrement\u00e1lne map-reduce alebo nie\u010do podobn\u00e9.<\/p>\n<p>Ak sa pozriete na inform\u00e1cie o tom v dokumentoch Google, d\u00fafam, \u017ee v\u00e1s nasmeruj\u00fa k nie\u010domu ako BigTable a BigQuery. Av\u0161ak v\u0161etky tieto rie\u0161enia s\u00fa sprev\u00e1dzan\u00e9 tak\u00fdm objemom hust\u00e9ho \u017earg\u00f3nu firemn\u00fdch predajov, \u017ee sa r\u00fdchlo vr\u00e1tite sp\u00e4\u0165 a za\u010dnete h\u013eada\u0165 nie\u010do in\u00e9.<\/p>\n<p>Posledn\u00e1 vec, ktor\u00fa potrebujete v pr\u00edpade datab\u00e1zy v re\u00e1lnom \u010dase \u2014 je nie\u010do vytvoren\u00e9 \u013eu\u010fmi a pre \u013eud\u00ed pracuj\u00facich na z\u00e1klade platov\u00e9ho podkontraktu.<\/p>\n<p><i>(*) To je vtip, neexistuje tak\u00e9to pojatie ako <noindex><a rel=\"nofollow\" href=\"http:\/\/seriot.ch\/parsing_json.php\">kompatibilita s JSON na 100%<\/a><\/noindex>.<\/i><\/p>\n<p><\/p>\n<h4>Na z\u00e1klade reklamy<\/h4>\n<p>\nH\u013ead\u00e1te <noindex><a rel=\"nofollow\" href=\"https:\/\/vdsina.ru\/cloud-servers?partner=habr130\">VDS<\/a><\/noindex> server na ladenie projektov, v\u00fdvoj a hosting? Ste presne n\u00e1\u0161 klient \ud83d\ude42 Denn\u00e9 pau\u0161\u00e1ly serverov r\u00f4znych konfigur\u00e1ci\u00ed, antiDDoS a licencie Windows u\u017e s\u00fa zahrnut\u00e9 v cene.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/vdsina.ru\/cloud-servers?partner=habr130\"><img decoding=\"async\" alt=\"T\u00e1to datab\u00e1za hor\u00ed...\" src=\"\/wp-content\/uploads\/2020\/10\/f1215924e9c1c41d00f7c71c6c569aa4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><br \/>\n<br \/>Zdroj: <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.3 - 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\/sk\/blog\/administrirovanie\/eta-baza-dannyh-v-ogne\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"sk_SK\" \/>\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\/sk\/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\udd47T\u00e1to datab\u00e1za je v plame\u0148och\u2026 | ProHoster","description":"Dovo\u013ete mi rozpr\u00e1va\u0165 technick\u00fd pr\u00edbeh. Pred mnoh\u00fdmi rokmi.","canonical_url":"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/eta-baza-dannyh-v-ogne","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sk_SK","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\/sk\/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\/sk\/wp-json\/wp\/v2\/posts\/96465","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/comments?post=96465"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts\/96465\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/media\/96466"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/media?parent=96465"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/categories?post=96465"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/tags?post=96465"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}