{"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\/cs\/blog\/administrirovanie\/eta-baza-dannyh-v-ogne","title":{"rendered":"Tato datab\u00e1ze sho\u0159\u00ed\u2026","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Tato datab\u00e1ze sho\u0159\u00ed\u2026\" src=\"\/wp-content\/uploads\/2020\/10\/e4e39a7039dad14422fd83c05f114d6f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDovolte mi vypr\u00e1v\u011bt technick\u00fd p\u0159\u00edb\u011bh.<\/p>\n<p>P\u0159ed mnoha lety jsem vyv\u00edjel aplikaci se zabudovan\u00fdmi funkcemi pro spolupr\u00e1ci. Byla to pohodln\u00e1 experiment\u00e1ln\u00ed sada, kter\u00e1 vyu\u017e\u00edvala pln\u00fd potenci\u00e1l ran\u00e9ho Reactu a CouchDB. V re\u00e1ln\u00e9m \u010dase synchronizovala data pomoc\u00ed JSON. <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Operational_transformation\">OT<\/a><\/noindex>. Pou\u017e\u00edvala se v intern\u00ed pr\u00e1ci spole\u010dnosti, av\u0161ak \u0161irok\u00e1 pou\u017eitelnost a potenci\u00e1l v dal\u0161\u00edch oblastech byly o\u010dividn\u00e9.<\/p>\n<p>Kdy\u017e jsme se sna\u017eili prodat tuto technologii potenci\u00e1ln\u00edm klient\u016fm, narazili jsme na neo\u010dek\u00e1vanou p\u0159ek\u00e1\u017eku. V demonstrativn\u00edm videu na\u0161e technologie vypadala a fungovala skv\u011ble, \u017e\u00e1dn\u00e9 probl\u00e9my. Video ukazovalo p\u0159esn\u011b to, jak to funguje, a nic se neimitovalo. Vymysleli jsme a zak\u00f3dovali realistick\u00fd sc\u00e9n\u00e1\u0159 pou\u017eit\u00ed programu.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\n<img decoding=\"async\" alt=\"Tato datab\u00e1ze sho\u0159\u00ed\u2026\" src=\"\/wp-content\/uploads\/2020\/10\/ea517a6aee0b015dc4d7bad4e86af6f4.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nVe skute\u010dnosti se to stalo probl\u00e9mem. Na\u0161e demo fungovalo p\u0159esn\u011b tak, jak imitovali pr\u00e1ci sv\u00fdch aplikac\u00ed v\u0161ichni ostatn\u00ed. Konkr\u00e9tn\u011b, informace byla okam\u017eit\u011b p\u0159en\u00e1\u0161ena z A do B, i kdy\u017e se jednalo o velk\u00e9 medi\u00e1ln\u00ed soubory. Po p\u0159ihl\u00e1\u0161en\u00ed ka\u017ed\u00fd u\u017eivatel vid\u011bl nov\u00e9 z\u00e1znamy. D\u00edky aplikaci mohli r\u016fzn\u00ed u\u017eivatel\u00e9 spolupracovat p\u0159esn\u011b na stejn\u00fdch projektech, i kdy\u017e do\u0161lo k p\u0159eru\u0161en\u00ed internetov\u00e9ho p\u0159ipojen\u00ed n\u011bkde na vesnici. Nep\u0159\u00edmo bylo toto nazna\u010deno v jak\u00e9mkoli sest\u0159\u00edhan\u00e9m videu o produktu v After Effects.<\/p>\n<p>I kdy\u017e v\u0161ichni v\u011bd\u011bli, k \u010demu slou\u017e\u00ed tla\u010d\u00edtko Obnovit, nikdo v\u016fbec nech\u00e1pal, \u017ee webov\u00e9 aplikace, kter\u00e9 od n\u00e1s \u017e\u00e1daj\u00ed, maj\u00ed obvykle sv\u00e1 omezen\u00ed. A \u017ee pokud u\u017e nebudou pot\u0159eba, u\u017eivatelsk\u00fd z\u00e1\u017eitek bude zcela odli\u0161n\u00fd. V\u011bt\u0161inou si v\u0161\u00edmal, \u017ee se d\u00e1 'chatovat', a zanech\u00e1vat pozn\u00e1mky, proto se ptali, \u010d\u00edm se to li\u0161\u00ed od Slacku. Uf!<\/p>\n<h2>Design ka\u017edodenn\u00edch synchronizac\u00ed<\/h2>\n<p>\nPokud m\u00e1te u\u017e n\u011bjak\u00e9 zku\u0161enosti s v\u00fdvojem softwaru, mus\u00ed v\u00e1s \u0161tv\u00e1t nutnost pamatovat si, \u017ee v\u011bt\u0161ina lid\u00ed se prost\u011b nem\u016f\u017ee pod\u00edvat na obr\u00e1zek rozhran\u00ed a pochopit, co bude d\u011blat p\u0159i interakci s n\u00edm. O tom, co se d\u011bje uvnit\u0159 samotn\u00e9ho programu, nemluv\u011b. <i>m\u016f\u017ee<\/i> to se v mnoha ohledech d\u011bje d\u00edky znalosti toho, co se nem\u016f\u017ee st\u00e1t a co by se d\u00edt nem\u011blo. K tomu je t\u0159eba <noindex><a rel=\"nofollow\" href=\"https:\/\/uxdesign.cc\/design-of-everyday-things-chapter-01-summary-and-keypoints-664d426a11e0\">ment\u00e1ln\u00ed model<\/a><\/noindex> nejen toho, co software d\u011bl\u00e1, ale tak\u00e9 toho, jak jsou jednotliv\u00e9 \u010d\u00e1sti vz\u00e1jemn\u011b slad\u011bny a komunikuj\u00ed.<\/p>\n<p>Klasick\u00fdm p\u0159\u00edkladem toho je u\u017eivatel, kter\u00fd po dobu dvaceti minut sleduje <i>spinner.gif<\/i>, p\u0159em\u00fd\u0161leje, kdy kone\u010dn\u011b skon\u010d\u00ed pr\u00e1ce. V\u00fdvoj\u00e1\u0159 by pochopil, \u017ee proces pravd\u011bpodobn\u011b zamrzl, a \u017ee gif nikdy nezmiz\u00ed z obrazovky. Tato animace simuluje prov\u00e1d\u011bn\u00ed pr\u00e1ce, ale nen\u00ed spojena s jej\u00edm stavem. V takov\u00fdch p\u0159\u00edpadech maj\u00ed n\u011bkte\u0159\u00ed technici r\u00e1di zakr\u00fdv\u00e1n\u00ed o\u010d\u00ed, ohromen\u00edm m\u00edrou omylu u\u017eivatel\u016f. Nicm\u00e9n\u011b si pov\u0161imn\u011bte, kdo z nich ukazuje na ot\u00e1\u010dej\u00edc\u00ed se hodiny a \u0159\u00edk\u00e1, \u017ee ve skute\u010dnosti stoj\u00ed na m\u00edst\u011b?<\/p>\n<p><img decoding=\"async\" alt=\"Tato datab\u00e1ze sho\u0159\u00ed\u2026\" src=\"\/wp-content\/uploads\/2020\/10\/db67c48846549b272a367c0a37aec97b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nO tom p\u0159ece jde o hodnotu re\u00e1ln\u00e9ho \u010dasu. V dne\u0161n\u00ed dob\u011b se datab\u00e1ze re\u00e1ln\u00e9ho \u010dasu vyu\u017e\u00edvaj\u00ed st\u00e1le velmi m\u00e1lo, a mnoz\u00ed se na n\u011b d\u00edvaj\u00ed s podez\u0159en\u00edm. V\u011bt\u0161ina t\u011bchto datab\u00e1z\u00ed se aktivn\u011b orientuje na styl NoSQL, co\u017e obvykle vede k pou\u017e\u00edv\u00e1n\u00ed \u0159e\u0161en\u00ed zalo\u017een\u00fdch na Mongo, na kter\u00e1 je lep\u0161\u00ed zapomenout. Ale pro m\u011b to znamen\u00e1 pohodlnou pr\u00e1ci s CouchDB a tak\u00e9 studium projektov\u00e1n\u00ed struktur, kter\u00e9 budou schopny napl\u0148ovat data nejen n\u011bjak\u00fdm byrokratem. Mysl\u00edm, \u017ee sv\u016fj \u010das vyu\u017e\u00edv\u00e1m optim\u00e1ln\u011bji.<\/p>\n<p>Ale skute\u010dn\u00e9 t\u00e9ma tohoto p\u0159\u00edsp\u011bvku je to, co dnes pou\u017e\u00edv\u00e1m. Ne z vlastn\u00edho v\u00fdb\u011bru, ale kv\u016fli lhostejn\u011b a slep\u011b pou\u017e\u00edvan\u00e9 firemn\u00ed politice. Proto uvedu \u00dapln\u011b \u010cestn\u00e9 a Nezaujat\u00e9 srovn\u00e1n\u00ed dvou \u00fazce spojen\u00fdch produkt\u016f pro pr\u00e1ci s datab\u00e1zemi re\u00e1ln\u00e9ho \u010dasu Google.<\/p>\n<p><img decoding=\"async\" alt=\"Tato datab\u00e1ze sho\u0159\u00ed\u2026\" src=\"\/wp-content\/uploads\/2020\/10\/89432de9501b7667f8e187d14afc8897.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nV n\u00e1zvech obou je slovo Fire. Na jeden si vzpom\u00edn\u00e1m s nostalgia. Druh\u00fd pro m\u011b p\u0159edstavuje jin\u00fd druh ohn\u011b. Nechci se usp\u011bchat se zmi\u0148ov\u00e1n\u00edm jejich n\u00e1zv\u016f, proto\u017ee jakmile to ud\u011bl\u00e1m, naraz\u00edme na prvn\u00ed velk\u00fd probl\u00e9m \u2013 na jm\u00e9na.<\/p>\n<p>Prvn\u00ed se naz\u00fdv\u00e1 <i>Firebase Real-Time Database<\/i>, a druh\u00fd je <i>Firebase Cloud Firestore<\/i>. Oba jsou produkty z <i>Firebase suite<\/i> Google. Jejich API se naz\u00fdvaj\u00ed, odpov\u00eddaj\u00edc\u00edm zp\u016fsobem, <code>firebase.database(\u2026)<\/code> a <code>firebase.firestore(\u2026)<\/code>.<\/p>\n<p>Stalo se to proto, \u017ee <i>Real-Time Database<\/i> je prost\u011b p\u016fvodn\u00ed <i>Firebase<\/i> p\u0159ed jeho zakoupen\u00edm Google v roce 2014. Pot\u00e9 se Google rozhodl vytvo\u0159it jako paraleln\u00ed produkt <i>kopii<\/i> Firebase zalo\u017een\u00e1 na velk\u00fdch datech spole\u010dnosti, a nazvali ji Firestore with a cloud. Douf\u00e1m, \u017ee jste se je\u0161t\u011b neztratili. Pokud jste se p\u0159ece jen ztratili, nebojte se, tuto \u010d\u00e1st \u010dl\u00e1nku jsem s\u00e1m p\u0159episoval desetkr\u00e1t.<\/p>\n<p>Proto\u017ee je pot\u0159eba uv\u00e9st <i>Firebase<\/i> ve v\u011bci t\u00fdkaj\u00edc\u00ed se Firebase, a <i>Firestore<\/i> ve v\u011bci t\u00fdkaj\u00edc\u00ed se Firebase, abyste byli pochopeni p\u0159ed n\u011bkolika lety na Stack Overflow.<\/p>\n<p>Kdyby existovala cena za nejhor\u0161\u00ed pojmenov\u00e1n\u00ed softwarov\u00fdch produkt\u016f, tento p\u0159\u00edpad by se ur\u010dit\u011b stal jedn\u00edm z uchaze\u010d\u016f. Hammingova vzd\u00e1lenost mezi t\u011bmito n\u00e1zvy je natolik mal\u00e1, \u017ee mate i zku\u0161en\u00e9 in\u017een\u00fdry, kte\u0159\u00ed p\u00ed\u0161\u00ed jedno jm\u00e9no, zat\u00edmco mysl\u00ed na jin\u00e9. To jsou pl\u00e1nov\u00e1n\u00ed, kter\u00e1 selhala s velik\u00fdm krav\u00e1lem, vym\u00fd\u0161len\u00e1 s t\u011bmi nejlep\u0161\u00edmi \u00famysly; splnila proroctv\u00ed, \u017ee datab\u00e1ze bude v plamenech. A v\u016fbec si ned\u011bl\u00e1m legraci. \u010clov\u011bk, kter\u00fd vymyslel takov\u00fd pojmenovac\u00ed syst\u00e9m, byl p\u0159\u00ed\u010dinou krve, potu a slz.<\/p>\n<p><img decoding=\"async\" alt=\"Tato datab\u00e1ze sho\u0159\u00ed\u2026\" src=\"\/wp-content\/uploads\/2020\/10\/b793ce183c5d0477c32c87f64bce5879.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>Pyrrhovo v\u00edt\u011bzstv\u00ed<\/h2>\n<p>\nMohlo by se zd\u00e1t, \u017ee Firestore je <i>n\u00e1hrada<\/i> Firebase, jeho potomek nov\u00e9 generace, ale to by bylo klamn\u00e9. Firestore zcela ur\u010dit\u011b nenahrazuje Firebase. Vypad\u00e1 to, \u017ee n\u011bkdo z n\u011bj odstranil v\u0161e zaj\u00edmav\u00e9, a v\u011bt\u0161inu zbyl\u00e9ho zmate\u010dn\u011b p\u0159ed\u011blal r\u016fzn\u00fdmi zp\u016fsoby.<\/p>\n<p>Av\u0161ak letm\u00fd pohled na dva produkty v\u00e1s m\u016f\u017ee zm\u00e1st: zd\u00e1 se, \u017ee d\u011blaj\u00ed to sam\u00e9, p\u0159es v\u011bt\u0161inou stejn\u00e9 API a dokonce ve stejn\u00e9 datab\u00e1zov\u00e9 relaci. Rozd\u00edly jsou nen\u00e1padn\u00e9 a objev\u00ed se pouze p\u0159i pe\u010dliv\u00e9m porovn\u00e1n\u00ed obs\u00e1hl\u00e9 dokumentace. Nebo kdy\u017e se sna\u017e\u00edte portovat dokonale funguj\u00edc\u00ed k\u00f3d z Firebase, aby fungoval s Firestore. Tehdy u\u017e zjist\u00edte, \u017ee datab\u00e1zov\u00e9 rozhran\u00ed se rozsv\u00edt\u00ed, jakmile se pokus\u00edte prov\u00e9st p\u0159etahov\u00e1n\u00ed my\u0161\u00ed v re\u00e1ln\u00e9m \u010dase. Opakuji, ned\u011bl\u00e1m si legraci.<\/p>\n<p>Klient Firebase je slu\u0161n\u00fd v tom smyslu, \u017ee ukl\u00e1d\u00e1 zm\u011bny do mezipam\u011bti a automaticky opakuje pokusy o aktualizaci, kdy d\u00e1v\u00e1 p\u0159ednost posledn\u00ed operaci z\u00e1pisu. Firestore m\u00e1 v\u0161ak omezen\u00ed na 1 z\u00e1pis na dokument na u\u017eivatele za sekundu, a toto omezen\u00ed je ulo\u017eeno serverem. P\u0159i jeho pou\u017e\u00edv\u00e1n\u00ed se mus\u00edte sami postarat o to, abyste na\u0161li zp\u016fsob, jak ho obej\u00edt, a zav\u00e9st rychlostn\u00ed limit pro aktualizace, i kdy\u017e se jen sna\u017e\u00edte vytvo\u0159it svou aplikaci. To znamen\u00e1, \u017ee Firestore je datab\u00e1ze v re\u00e1ln\u00e9m \u010dase, ale bez klienta v re\u00e1ln\u00e9m \u010dase, kter\u00e1 se sna\u017e\u00ed se takovou tv\u00e1\u0159it pomoc\u00ed API.<\/p>\n<p>Na tomto bodu za\u010d\u00edn\u00e1me vid\u011bt prvn\u00ed n\u00e1znaky smyslu existence Firestore. Mo\u017en\u00e1 se pletu, ale m\u00e1m podez\u0159en\u00ed, \u017ee n\u011bkdo vysoko v Google veden\u00ed se po koupi Firebase pod\u00edval a jednodu\u0161e \u0159ekl: \u201eNe, bo\u017ee, ne. To je nep\u0159ijateln\u00e9. Jen ne pod m\u00fdm veden\u00edm.\u201c<\/p>\n<p><img decoding=\"async\" alt=\"Tato datab\u00e1ze sho\u0159\u00ed\u2026\" src=\"\/wp-content\/uploads\/2020\/10\/fbb5ce5ff93b4e3a7bdcd12cce3bdd92.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nVystoupil ze sv\u00fdch komnat a prohl\u00e1sil:<\/p>\n<p><i>\u201eJednoduch\u00fd velk\u00fd dokument JSON? Ne. Rozd\u011bl\u00edte data na jednotliv\u00e9 dokumenty, p\u0159i\u010dem\u017e ka\u017ed\u00fd z nich bude m\u00edt maxim\u00e1ln\u00ed velikost 1 megabajt.\u201c<\/i><\/p>\n<p>Zd\u00e1 se, \u017ee takov\u00e9 omezen\u00ed nep\u0159e\u017eije prvn\u00ed st\u0159etnut\u00ed s jakoukoli dostate\u010dn\u011b motivovanou u\u017eivatelskou z\u00e1kladnou. V\u00edte, \u017ee to tak je. Nap\u0159\u00edklad u n\u00e1s v pr\u00e1ci m\u00e1me v\u00edce ne\u017e tis\u00edc p\u011bt set prezentac\u00ed, a to je zcela norm\u00e1ln\u00ed.<\/p>\n<p>S t\u00edmto omezen\u00edm budete muset p\u0159ijmout skute\u010dnost, \u017ee jeden \u201edokument\u201c v datab\u00e1zi nebude vypadat jako \u017e\u00e1dn\u00fd objekt, kter\u00fd by u\u017eivatel mohl nazvat dokumentem.<\/p>\n<p><i>\u201ePole pol\u00ed, kter\u00e1 mohou rekurzivn\u011b obsahovat jin\u00e9 prvky? Ne. Pole budou obsahovat pouze objekty nebo \u010d\u00edsla pevn\u00e9 d\u00e9lky, jak bylo zam\u00fd\u0161leno P\u00e1nem.\u201c<\/i><\/p>\n<p>Pokud jste tedy doufali, \u017ee do sv\u00e9ho Firestore um\u00edst\u00edte GeoJSON, zjist\u00edte, \u017ee to nen\u00ed mo\u017en\u00e9. Nic v\u00edc ne\u017e jednorozm\u011brn\u00e9 nen\u00ed p\u0159\u00edpustn\u00e9. Douf\u00e1m, \u017ee m\u00e1te r\u00e1di Base64 a\/nebo JSON uvnit\u0159 JSON.<\/p>\n<p><i>\u201eImport a export JSON p\u0159es HTTP, n\u00e1stroje p\u0159\u00edkazov\u00e9ho \u0159\u00e1dku nebo administr\u00e1torsk\u00fd panel? Ne. Budete moci pouze exportovat a importovat data do Google Cloud Storage. Tak to te\u010f vypad\u00e1. A kdy\u017e \u0159\u00edk\u00e1m \u201evy\u201c, mysl\u00edm t\u00edm pouze ty, kte\u0159\u00ed maj\u00ed opr\u00e1vn\u011bn\u00ed Project Owner. V\u0161ichni ostatn\u00ed mohou j\u00edt a vytvo\u0159it tikety.\u201c<\/i><\/p>\n<p>Jak vid\u00edte, model dat FireBase je snadno popsateln\u00e9. Obsahuje jeden obrovsk\u00fd dokument JSON, kter\u00fd propojuje JSON kl\u00ed\u010de s URL cestami. Pokud to zap\u00ed\u0161ete pomoc\u00ed <code>HTTP PUT<\/code> v <code>\/<\/code> FireBase n\u00e1sleduj\u00edc\u00ed:<\/p>\n<pre><code class=\"json\">{\n  \"hello\": \"sv\u011bt\"\n}<\/code><\/pre>\n<p>\nTak\u017ee <code>GET \/hello<\/code> vr\u00e1t\u00ed <code>\"sv\u011bt\"<\/code>. V podstat\u011b to funguje p\u0159esn\u011b tak, jak o\u010dek\u00e1v\u00e1te. Kolekce objekt\u016f FireBase <code>\/my-collection\/:id<\/code> je ekvivalentn\u00ed JSON slovn\u00edku <code>{\"my-collection\": {...}}<\/code> v ko\u0159eni, jeho\u017e obsah je dostupn\u00fd na <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 skv\u011ble, pokud ka\u017ed\u00e9 vlo\u017een\u00ed m\u00e1 ID bez koliz\u00ed, pro co\u017e m\u00e1 syst\u00e9m standardn\u00ed \u0159e\u0161en\u00ed.<\/p>\n<p>Jin\u00fdmi slovy, datab\u00e1ze je 100% kompatibiln\u00ed s JSON (*) a skv\u011ble funguje s HTTP, nap\u0159\u00edklad s CouchDB. Ale v\u011bt\u0161inou ji pou\u017e\u00edv\u00e1te prost\u0159ednictv\u00edm API v re\u00e1ln\u00e9m \u010dase, kter\u00e9 abstrahuje sockets, autorizaci a odb\u011bry. Administr\u00e1torsk\u00e1 panel nab\u00edz\u00ed ob\u011b mo\u017enosti, umo\u017e\u0148uje jak prov\u00e1d\u011bt \u00fapravy v re\u00e1ln\u00e9m \u010dase, tak tak\u00e9 import\/export JSON. Pokud se ve sv\u00e9m k\u00f3du budete dr\u017eet stejn\u00e9ho p\u0159\u00edstupu, p\u0159ekvap\u00ed v\u00e1s, kolik specializovan\u00e9ho k\u00f3du zmiz\u00ed, kdy\u017e pochop\u00edte, \u017ee patch a diff JSON \u0159e\u0161\u00ed 90% rutinn\u00edch \u00faloh zpracov\u00e1n\u00ed trval\u00e9ho stavu.<\/p>\n<p>Model dat Firestore je podobn\u00fd JSON, ale v n\u011bkter\u00fdch kritick\u00fdch aspektech se od n\u011bj li\u0161\u00ed. Ji\u017e jsem zm\u00ednil absenci pol\u00ed uvnit\u0159 pol\u00ed. Model sub-kolekc\u00ed spo\u010d\u00edv\u00e1 v tom, \u017ee jsou koncepty prvn\u00ed t\u0159\u00eddy, odd\u011blen\u00e9 od dokumentu JSON, kter\u00fd je obsahuje. Proto\u017ee neexistuje \u017e\u00e1dn\u00e1 hotov\u00e1 serializace, vy\u017eaduje z\u00edsk\u00e1v\u00e1n\u00ed a z\u00e1pis dat specializovan\u00fd postup k\u00f3du. Pro zpracov\u00e1n\u00ed vlastn\u00edch kolekc\u00ed je nutn\u00e9 ps\u00e1t vlastn\u00ed skripty a n\u00e1stroje. Administr\u00e1torsk\u00e1 panel v\u00e1m umo\u017e\u0148uje prov\u00e1d\u011bt pouze drobn\u00e9 zm\u011bny po jednom poli najednou a nem\u00e1 mo\u017enosti importu\/exportu.<\/p>\n<p>Vzali real-time NoSQL datab\u00e1zi a prom\u011bnili ji na pomalou non-SQL s automatick\u00fdm slu\u010dov\u00e1n\u00edm a odd\u011blen\u00fdm sloupcem non-JSON. <i>N\u011bco jako GraftQL<\/i>.<\/p>\n<p><img decoding=\"async\" alt=\"Tato datab\u00e1ze sho\u0159\u00ed\u2026\" src=\"\/wp-content\/uploads\/2020\/10\/c6e842418996c96f1efa873774f35f44.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>Hork\u00fd Java<\/h2>\n<p>\nPokud m\u00e1 Firestore b\u00fdt spolehliv\u011bj\u0161\u00ed a \u0161k\u00e1lovateln\u011bj\u0161\u00ed, je ironick\u00e9, \u017ee pr\u016fm\u011brn\u00fd v\u00fdvoj\u00e1\u0159 dost\u00e1v\u00e1 m\u00e9n\u011b spolehliv\u00e9 \u0159e\u0161en\u00ed, ne\u017e by z\u00edskal v\u00fdb\u011brem FireBase \u201ez krabice\u201c. Software, kter\u00fd pot\u0159ebuje H\u00e1dav\u00fd Spr\u00e1vce Dat, vy\u017eaduje takovou \u00farove\u0148 \u00fasil\u00ed a kvality specialist\u016f, \u017ee je to zkr\u00e1tka nerealistick\u00e9 pro inovaci, ve kter\u00e9 by m\u011bl b\u00fdt dobr\u00fd produkt. Je to podobn\u00e9 tomu, jak HTML5 Canvas nen\u00ed skute\u010dnou n\u00e1hradou za Flash, pokud nejsou k dispozici v\u00fdvoj\u00e1\u0159sk\u00e9 n\u00e1stroje a p\u0159ehr\u00e1va\u010d. Nav\u00edc Firestore uv\u00edzla v touze po \u010distot\u011b dat a steriln\u00ed validaci, co\u017e jednodu\u0161e neodpov\u00edd\u00e1 tomu, jak pr\u016fm\u011brn\u00fd obchodn\u00ed u\u017eivatel, <i>r\u00e1d pracuje<\/i>: pro n\u011bj nen\u00ed nic nezbytn\u00e9, proto\u017ee a\u017e do konce je v\u0161echno jen koncept.<\/p>\n<p>Hlavn\u00ed nev\u00fdhodou FireBase je, \u017ee klient byl vytvo\u0159en o n\u011bkolik let d\u0159\u00edve, ne\u017e m\u011bl, je\u0161t\u011b p\u0159edt\u00edm, ne\u017e v\u011bt\u0161ina webov\u00fdch v\u00fdvoj\u00e1\u0159\u016f pochopila imutabilitu. Z tohoto d\u016fvodu FireBase p\u0159edpokl\u00e1d\u00e1, \u017ee budete data m\u011bnit, a proto nevyu\u017e\u00edv\u00e1 v\u00fdhod, kter\u00e9 imutabilita pro u\u017eivatele nab\u00edz\u00ed. Nav\u00edc nepou\u017e\u00edv\u00e1 data opakovan\u011b v u\u017eivatelsk\u00fdch sn\u00edmc\u00edch, co\u017e zp\u016fsobuje, \u017ee prov\u00e1d\u011bt diff je mnohem slo\u017eit\u011bj\u0161\u00ed. Pro velk\u00e9 dokumenty je jej\u00ed mechanismus transakc\u00ed na z\u00e1klad\u011b m\u011bniteln\u00fdch diff naprosto nedostate\u010dn\u00fd. Kluci, v\u017edy\u0165 u\u017e m\u00e1me <code>WeakMap<\/code> v JavaScriptu. Je to pohodln\u00e9.<\/p>\n<p>Pokud dat\u016fm dod\u00e1te po\u017eadovan\u00fd tvar a neud\u011bl\u00e1te stromy p\u0159\u00edli\u0161 objemn\u00fdmi, lze tomuto probl\u00e9mu uniknout. Ale zaj\u00edm\u00e1 m\u011b, zda by FireBase byla mnohem zaj\u00edmav\u011bj\u0161\u00ed, kdyby v\u00fdvoj\u00e1\u0159i vydali skute\u010dn\u011b dobr\u00e9 klientsk\u00e9 API, kter\u00e9 by pou\u017e\u00edvalo imutabilitu ve spojen\u00ed se skute\u010dn\u011b praktick\u00fdm radou ohledn\u011b struktury datab\u00e1z\u00ed. M\u00edsto toho se zd\u00e1, \u017ee se sna\u017eili opravit n\u011bco, co nen\u00ed rozbit\u00e9, a t\u00edm se to zhor\u0161ilo.<\/p>\n<p>Nev\u00edm, jak\u00e1 logika st\u00e1la za vytvo\u0159en\u00edm Firestore. \u00davahy o motivech, kter\u00e9 vznikaj\u00ed uvnit\u0159 \u010dern\u00e9 sk\u0159\u00ed\u0148ky, jsou tak\u00e9 sou\u010d\u00e1st\u00ed z\u00e1bavy. Takov\u00e9 postaven\u00ed protikladu dvou extr\u00e9mn\u011b podobn\u00fdch, av\u0161ak nesrovnateln\u00fdch datab\u00e1z\u00ed se vyskytuje pom\u011brn\u011b z\u0159\u00eddka. Jakoby si n\u011bkdo pomyslel: <i>\u201eFirebase je prost\u011b funkce, kterou m\u016f\u017eeme emulovat v Google Cloud\u201c<\/i>, ale p\u0159itom je\u0161t\u011b neobjevil koncept definov\u00e1n\u00ed po\u017eadavk\u016f re\u00e1ln\u00e9ho sv\u011bta nebo vytv\u00e1\u0159en\u00ed u\u017eite\u010dn\u00fdch \u0159e\u0161en\u00ed, kter\u00e1 spl\u0148uj\u00ed v\u0161echny tyto po\u017eadavky. <i>\u201eNechte to na v\u00fdvoj\u00e1\u0159\u00edch. Prost\u011b ud\u011blejte u\u017eivatelsk\u00e9 rozhran\u00ed p\u011bkn\u00e9\u2026 A co takhle p\u0159idat v\u00edc ohn\u011b?\u201c<\/i><\/p>\n<p>Rozum\u00edm p\u00e1r v\u011bcem o datov\u00fdch struktur\u00e1ch. Ur\u010dit\u011b vid\u00edm, \u017ee koncept \u201ev\u0161echno v jednom velk\u00e9m JSON strom\u011b\u201c je pokusem abstrahovat z datab\u00e1ze jak\u00fdkoli pocit rozs\u00e1hl\u00e9 struktury. O\u010dek\u00e1vat, \u017ee software si jednodu\u0161e porad\u00ed s jak\u00fdmikoli pochybn\u00fdmi frakt\u00e1ly datov\u00e9 struktury \u2014 to je prost\u011b \u0161\u00edlenstv\u00ed. Ani si nemus\u00edm p\u0159edstavovat, jak \u0161patn\u011b to m\u016f\u017ee vypadat, provedl jsem p\u0159\u00edsn\u00e9 audity k\u00f3du a <i>vid\u011bl jsem v\u011bci, kter\u00e9 v\u00e1m, lid\u00e9, ani nesnily.<\/i>. Ale tak\u00e9 v\u00edm, jak vypadaj\u00ed dobr\u00e9 struktury, <noindex><a rel=\"nofollow\" href=\"https:\/\/acko.net\/blog\/apis-are-about-policy\">jak je pou\u017e\u00edvat,<\/a><\/noindex> a <noindex><a rel=\"nofollow\" href=\"https:\/\/acko.net\/blog\/software-development-as-advanced-damage-control\/\">pro\u010d je to d\u016fle\u017eit\u00e9.<\/a><\/noindex>. M\u016f\u017eu si p\u0159edstavit sv\u011bt, ve kter\u00e9m by Firestore vypadala zcela logicky, a lid\u00e9, kte\u0159\u00ed ji vytvo\u0159ili, by si mysleli, \u017ee odvedli dobrou pr\u00e1ci. Ale ne\u017eijeme v tomto sv\u011bt\u011b.<\/p>\n<p>Podpora dotazov\u00e1n\u00ed v Firebase je podle jak\u00fdchkoli standard\u016f \u0161patn\u00e1, prakticky neexistuje. Ur\u010dit\u011b vy\u017eaduje zlep\u0161en\u00ed nebo alespo\u0148 revizi. Ale Firestore nen\u00ed o moc lep\u0161\u00ed, proto\u017ee je omezena stejn\u00fdmi jednorozm\u011brn\u00fdmi indexy, kter\u00e9 m\u00e1me v jednoduch\u00e9m SQL. Pokud pot\u0159ebujete dotazy, kter\u00e9 lid\u00e9 prov\u00e1d\u011bj\u00ed s chaotick\u00fdmi daty, pak pot\u0159ebujete fulltextov\u00e9 vyhled\u00e1v\u00e1n\u00ed, filtry na v\u00edce rozsaz\u00edch a libovoln\u011b definovan\u00fd po\u0159\u00e1dek. P\u0159i pe\u010dliv\u00e9m zkoum\u00e1n\u00ed jsou funkce jednoduch\u00e9ho SQL samy o sob\u011b p\u0159\u00edli\u0161 omezen\u00e9. Nav\u00edc jedin\u00e9 SQL dotazy, kter\u00e9 lid\u00e9 mohou prov\u00e1d\u011bt v produkci \u2014 jsou rychl\u00e9 dotazy. Budete pot\u0159ebovat specializovan\u00e9 \u0159e\u0161en\u00ed pro indexaci s promy\u0161len\u00fdmi datov\u00fdmi strukturami. Pro v\u0161echno ostatn\u00ed by alespo\u0148 m\u011blo b\u00fdt inkrement\u00e1ln\u00ed map-reduce nebo n\u011bco podobn\u00e9ho.<\/p>\n<p>Pokud vyhled\u00e1te informace o tom v dokumentech Google, douf\u00e1m, \u017ee v\u00e1s nasm\u011bruj\u00ed k n\u011b\u010demu jako BigTable a BigQuery. Nicm\u00e9n\u011b v\u0161echna tato \u0159e\u0161en\u00ed p\u0159ich\u00e1zej\u00ed s takov\u00fdm objemem hust\u00e9 korpor\u00e1tn\u00ed prodejn\u00ed hant\u00fdrky, \u017ee se rychle vr\u00e1t\u00edte zp\u011bt a za\u010dnete hledat n\u011bco jin\u00e9ho.<\/p>\n<p>Posledn\u00ed, co pot\u0159ebujete v p\u0159\u00edpad\u011b datab\u00e1ze v re\u00e1ln\u00e9m \u010dase \u2014 je n\u011bco, co vytvo\u0159ili lid\u00e9 a pro lidi, kte\u0159\u00ed pracuj\u00ed na mzdov\u00e9 \u0161k\u00e1le pro veden\u00ed.<\/p>\n<p><i>(*) To je vtip, takov\u00e9 pojmy neexistuj\u00ed, jako <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\u00e1klad\u011b reklamy<\/h4>\n<p>\nHled\u00e1te <noindex><a rel=\"nofollow\" href=\"https:\/\/vdsina.ru\/cloud-servers?partner=habr130\">VDS<\/a><\/noindex> server pro lad\u011bn\u00ed projekt\u016f, hosting a v\u00fdvoj? Ur\u010dit\u011b jste na\u0161\u00edm klientem \ud83d\ude42 Denn\u00ed tarify server\u016f s r\u016fzn\u00fdmi konfiguracemi, antiDDoS a licence Windows ji\u017e zahrnuty v cen\u011b.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/vdsina.ru\/cloud-servers?partner=habr130\"><img decoding=\"async\" alt=\"Tato datab\u00e1ze sho\u0159\u00ed\u2026\" 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\/cs\/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=\"cs_CZ\" \/>\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\/cs\/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\udd47Tato datab\u00e1ze je v ohni\u2026 | ProHoster","description":"Dovolte mi vypr\u00e1v\u011bt technick\u00fd p\u0159\u00edb\u011bh. Mnoho let.","canonical_url":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/eta-baza-dannyh-v-ogne","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"cs_CZ","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\/cs\/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\/cs\/wp-json\/wp\/v2\/posts\/96465","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/comments?post=96465"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/96465\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media\/96466"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media?parent=96465"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/categories?post=96465"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/tags?post=96465"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}