{"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\/hu\/blog\/administrirovanie\/eta-baza-dannyh-v-ogne","title":{"rendered":"Ez az adatb\u00e1zis l\u00e1ngol...","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Ez az adatb\u00e1zis l\u00e1ngol...\" src=\"\/wp-content\/uploads\/2020\/10\/e4e39a7039dad14422fd83c05f114d6f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEngedje meg, hogy mes\u00e9ljek egy technikai t\u00f6rt\u00e9netet.<\/p>\n<p>Sok \u00e9vvel ezel\u0151tt egy olyan alkalmaz\u00e1st fejlesztettem, amelyben kollabor\u00e1ci\u00f3s funkci\u00f3k voltak be\u00e9p\u00edtve. Ez egy k\u00e9nyelmes k\u00eds\u00e9rleti stack volt, amely a korai React \u00e9s CouchDB teljes potenci\u00e1lj\u00e1t kihaszn\u00e1lta. Val\u00f3s id\u0151ben szinkroniz\u00e1lta az adatokat JSON-on kereszt\u00fcl. <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Operational_transformation\">OT<\/a><\/noindex>. Ezt a v\u00e1llalat bels\u0151 munk\u00e1iban haszn\u00e1lt\u00e1k, de a sz\u00e9lesk\u00f6r\u0171 alkalmazhat\u00f3s\u00e1g \u00e9s a t\u00f6bbi ter\u00fcleten rejl\u0151 potenci\u00e1l vil\u00e1gos volt.<\/p>\n<p>Amikor pr\u00f3b\u00e1ltuk eladni a potenci\u00e1lis \u00fcgyfeleknek ezt a technol\u00f3gi\u00e1t, v\u00e1ratlan akad\u00e1lyba \u00fctk\u00f6zt\u00fcnk. A bemutat\u00f3 vide\u00f3ban a technol\u00f3gi\u00e1nk remek\u00fcl n\u00e9zett ki \u00e9s m\u0171k\u00f6d\u00f6tt, itt semmif\u00e9le probl\u00e9ma nem volt. A vide\u00f3 pontosan azt mutatta, hogyan m\u0171k\u00f6dik, \u00e9s semmi nem volt manipul\u00e1lva benne. Egy val\u00f3s\u00e1gh\u0171 haszn\u00e1lati forgat\u00f3k\u00f6nyvet tal\u00e1ltunk ki \u00e9s k\u00f3doltunk.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\n<img decoding=\"async\" alt=\"Ez az adatb\u00e1zis l\u00e1ngol...\" src=\"\/wp-content\/uploads\/2020\/10\/ea517a6aee0b015dc4d7bad4e86af6f4.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nVal\u00f3j\u00e1ban ez lett a probl\u00e9ma. A dem\u00f3nk pontosan \u00fagy m\u0171k\u00f6d\u00f6tt, ahogy mindenki m\u00e1s is ut\u00e1nozta az alkalmaz\u00e1sainak m\u0171k\u00f6d\u00e9s\u00e9t. Konkr\u00e9tan az inform\u00e1ci\u00f3 azonnal \u00e1tker\u00fclt A-b\u00f3l B-be, m\u00e9g akkor is, ha nagy m\u00e9diaf\u00e1jlokr\u00f3l volt sz\u00f3. A bel\u00e9p\u00e9s ut\u00e1n minden felhaszn\u00e1l\u00f3 \u00faj bejegyz\u00e9seket l\u00e1tott. Az alkalmaz\u00e1s seg\u00edts\u00e9g\u00e9vel a k\u00fcl\u00f6nb\u00f6z\u0151 felhaszn\u00e1l\u00f3k vil\u00e1gosan tudtak egy\u00fctt dolgozni ugyanazokon a projekteken, m\u00e9g ha valahol a faluban megszakadt is az internetkapcsolat. Ez ut\u00f3bbira b\u00e1rmely After Effects-ben k\u00e9sz\u00fclt term\u00e9kvide\u00f3ban k\u00f6zvetve utalnak.<\/p>\n<p>B\u00e1r mindenki tudta, mire val\u00f3 a Friss\u00edt\u00e9s gomb, senki nem \u00e9rtette meg, hogy a webalkalmaz\u00e1sok, amelyeket k\u00e9rnek t\u0151l\u00fcnk, \u00e1ltal\u00e1ban korl\u00e1toz\u00e1sokkal b\u00edrnak. \u00c9s hogy ha ezek m\u00e1r nem sz\u00fcks\u00e9gesek, a felhaszn\u00e1l\u00f3i tapasztalat teljesen m\u00e1s lesz. F\u0151k\u00e9nt azt vett\u00e9k \u00e9szre, hogy lehet \"csetelni\", jegyzeteket hagyva a besz\u00e9lget\u0151partnereiknek, ez\u00e9rt azon t\u0171n\u0151dtek, miben k\u00fcl\u00f6nb\u00f6zik ez p\u00e9ld\u00e1ul a Slackt\u0151l. H\u0171ha!<\/p>\n<h2>A mindennapi szinkroniz\u00e1l\u00e1sok tervez\u00e9se<\/h2>\n<p>\nHa m\u00e1r van szoftverfejleszt\u00e9si tapasztalata, a legideges\u00edt\u0151bb dolog az, hogy eml\u00e9keznie kell arra, hogy a legt\u00f6bb ember nem k\u00e9pes egyszer\u0171en r\u00e1n\u00e9zni a felhaszn\u00e1l\u00f3i fel\u00fclet k\u00e9p\u00e9re \u00e9s meg\u00e9rteni, mit fog tenni, amikor k\u00f6lcs\u00f6nhat\u00e1sba l\u00e9p vele. Nem is besz\u00e9lve arr\u00f3l, mi t\u00f6rt\u00e9nik mag\u00e1ban a programban. Az, hogy mi <i>k\u00e9pes<\/i> t\u00f6rt\u00e9nhet \u2014 nagym\u00e9rt\u00e9kben azon tud\u00e1s eredm\u00e9nye, hogy mi nem t\u00f6rt\u00e9nhet meg \u00e9s mi nem is kellene, hogy megt\u00f6rt\u00e9njen. Ehhez sz\u00fcks\u00e9ges <noindex><a rel=\"nofollow\" href=\"https:\/\/uxdesign.cc\/design-of-everyday-things-chapter-01-summary-and-keypoints-664d426a11e0\">ment\u00e1lis modell<\/a><\/noindex> nemcsak arra, amit a szoftver csin\u00e1l, hanem arra is, hogyan vannak \u00f6sszhangban \u00e9s hogyan kommunik\u00e1lnak egym\u00e1ssal az egyes r\u00e9szei.<\/p>\n<p>A klasszikus p\u00e9lda erre egy felhaszn\u00e1l\u00f3, aki h\u00fasz percig n\u00e9zi a <i>spinner.gif<\/i>, tal\u00e1lgatva, mikor \u00e9r v\u00e9get v\u00e9gre a folyamat. A fejleszt\u0151 meg\u00e9rten\u00e9, hogy a folyamat val\u00f3sz\u00edn\u0171leg lefagyott, \u00e9s hogy a gif soha nem fog elt\u0171nni a k\u00e9perny\u0151r\u0151l. Ez az anim\u00e1ci\u00f3 imit\u00e1lja a munka elv\u00e9gz\u00e9s\u00e9t, de nincs k\u00f6ze a t\u00e9nyleges \u00e1llapot\u00e1hoz. Ilyen esetekben egyes technikai szakemberek szeretik a szem\u00fcket forgatni, csod\u00e1lkozva a felhaszn\u00e1l\u00f3k t\u00e9ved\u00e9s\u00e9nek m\u00e9rt\u00e9k\u00e9n. De \u00e9szrevetted, hogy ki mutat a forg\u00f3 \u00f3r\u00e1kra, \u00e9s mondja, hogy val\u00f3j\u00e1ban mozdulatlanok?<\/p>\n<p><img decoding=\"async\" alt=\"Ez az adatb\u00e1zis l\u00e1ngol...\" src=\"\/wp-content\/uploads\/2020\/10\/db67c48846549b272a367c0a37aec97b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nEz a val\u00f3s idej\u0171 \u00e9rt\u00e9k\u00e9nek l\u00e9nyege. Manaps\u00e1g a val\u00f3s idej\u0171 adatb\u00e1zisokat m\u00e9g mindig nagyon kev\u00e9sb\u00e9 haszn\u00e1lj\u00e1k, \u00e9s sokan gyanakv\u00e1ssal viseltetnek ir\u00e1ntuk. A legt\u00f6bb ilyen adatb\u00e1zis akt\u00edvan hajlik a NoSQL st\u00edlushoz, ez\u00e9rt \u00e1ltal\u00e1ban a Mongo alap\u00fa megold\u00e1sokat haszn\u00e1lj\u00e1k, amelyeket jobb lenne elfelejteni. De sz\u00e1momra ez a CouchDB-vel val\u00f3 k\u00e9nyelmes munka \u00e9s olyan strukt\u00far\u00e1k tervez\u00e9s\u00e9nek tanulm\u00e1nyoz\u00e1s\u00e1t jelenti, amelyeket nemcsak valamilyen b\u00fcrokrata tud felt\u00f6lteni adatokkal. Azt hiszem, jobban kihaszn\u00e1lom az id\u0151met.<\/p>\n<p>De a posztom val\u00f3di t\u00e9m\u00e1ja az, amit ma haszn\u00e1lok. Nem a v\u00e1laszt\u00e1som miatt, hanem a k\u00f6z\u00f6mb\u00f6sen \u00e9s vakon alkalmazott v\u00e1llalati politika miatt. Ez\u00e9rt bemutatok egy Teljesen \u0150szinte \u00e9s P\u00e1rtatlan \u00f6sszehasonl\u00edt\u00e1st k\u00e9t, szorosan \u00f6sszefon\u00f3d\u00f3 term\u00e9kr\u0151l, amelyek val\u00f3s idej\u0171 adatb\u00e1zisokkal foglalkoznak a Google-t\u0151l.<\/p>\n<p><img decoding=\"async\" alt=\"Ez az adatb\u00e1zis l\u00e1ngol...\" src=\"\/wp-content\/uploads\/2020\/10\/89432de9501b7667f8e187d14afc8897.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nMindk\u00e9t n\u00e9vben szerepel a Fire sz\u00f3. Az egyiket szeretettel eml\u00e9kezem, a m\u00e1sik sz\u00e1momra m\u00e1sfajta t\u00fczet jelent. Nem sietek kimondani a nev\u00fcket, mert amint ezt megteszem, szembes\u00fcln\u00fcnk kell az els\u0151 nagy probl\u00e9m\u00e1val \u2013 a nevekkel.<\/p>\n<p>Az els\u0151 neve <i>Firebase Real-Time Database<\/i>, a m\u00e1sodik pedig <i>Firebase Cloud Firestore<\/i>. Mindkett\u0151 a <i>Firebase suite<\/i> Google-t\u0151l. Az API-juk neve, megfelel\u0151en, <code>firebase.database(\u2026)<\/code> \u00e9s <code>firebase.firestore(\u2026)<\/code>.<\/p>\n<p>\u00cdgy alakult, mert a <i>Real-Time Database<\/i> csup\u00e1n a forr\u00e1sa <i>Firebase<\/i> a Google \u00e1ltali megv\u00e1s\u00e1rl\u00e1s el\u0151tt, 2014-ben. Ezut\u00e1n a Google \u00fagy d\u00f6nt\u00f6tt, hogy p\u00e1rhuzamos term\u00e9kk\u00e9nt l\u00e9trehozza a <i>m\u00e1solat\u00e1t<\/i> Firebase a c\u00e9g big data-j\u00e1nak alapj\u00e1val, \u00e9s elnevezte Firestore-nak egy felh\u0151ben. Rem\u00e9lem, m\u00e9g nem zavarodt\u00e1l \u00f6ssze. Ha m\u00e9gis \u00f6sszezavarodt\u00e1l, ne agg\u00f3dj, \u00e9n magam t\u00edzszer \u00edrtam \u00e1t ezt a cikk r\u00e9sz\u00e9t.<\/p>\n<p>Mert meg kell mutatni <i>Firebase<\/i> a Firebase-szal kapcsolatban, \u00e9s <i>Firestore<\/i> a Firebase-szal kapcsolatban, legal\u00e1bbis, hogy n\u00e9h\u00e1ny \u00e9vvel ezel\u0151tt a Stack Overflow-n meg\u00e9rtsenek.<\/p>\n<p>Ha l\u00e9tezne d\u00edj a legrosszabb szoftverterm\u00e9kek elnevez\u00e9s\u00e9\u00e9rt, akkor ez a p\u00e9lda hat\u00e1rozottan egyik jel\u00f6lt lenne. A Hamming-t\u00e1vols\u00e1g e nevek k\u00f6z\u00f6tt annyira kicsi, hogy m\u00e9g a tapasztalt m\u00e9rn\u00f6k\u00f6ket is \u00f6sszezavarja, akiknek az ujjaik egy nevet \u00edrnak be, mik\u00f6zben a fej\u00fck m\u00e1sra gondol. Ezek kudarccal v\u00e9gz\u0151d\u00f6tt tervek, amelyeket a legjobb sz\u00e1nd\u00e9kkal tal\u00e1ltak ki; beteljes\u00edtett\u00e9k azt a pr\u00f3f\u00e9ci\u00e1t, hogy az adatb\u00e1zis l\u00e1ngba fog borulni. \u00c9s egy\u00e1ltal\u00e1n nem viccelek. Az a szem\u00e9ly, aki ilyen elnevez\u00e9si s\u00e9m\u00e1t alkotott, v\u00e9r, verejt\u00e9k \u00e9s k\u00f6nnyek okoz\u00f3ja lett.<\/p>\n<p><img decoding=\"async\" alt=\"Ez az adatb\u00e1zis l\u00e1ngol...\" src=\"\/wp-content\/uploads\/2020\/10\/b793ce183c5d0477c32c87f64bce5879.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>Pyrrhoszi gy\u0151zelem<\/h2>\n<p>\nEl lehetne gondolkodni azon, hogy a Firestore egy <i>helyettes\u00edt\u0151je<\/i> a Firebase-nek, a k\u00f6vetkez\u0151 gener\u00e1ci\u00f3s ut\u00f3dj\u00e1nak, de ez t\u00e9ved\u00e9s lenne. A Firestore nem alkalmas a Firebase helyettes\u00edt\u00e9s\u00e9re. \u00dagy t\u0171nik, hogy valaki mindent \u00e9rdekeset elt\u00e1vol\u00edtott bel\u0151le, m\u00edg a marad\u00e9kot k\u00fcl\u00f6nb\u00f6z\u0151 m\u00f3dokon \u00f6sszezavarta.<\/p>\n<p>Azonban egy gyors pillant\u00e1s a k\u00e9t term\u00e9kre megt\u00e9veszt\u0151 lehet: \u00fagy t\u0171nik, mintha ugyanazt csin\u00e1ln\u00e1k, l\u00e9nyeg\u00e9ben azonos API-kon kereszt\u00fcl, \u00e9s m\u00e9g ugyanabban az adatb\u00e1zis-munkamenetben is. A k\u00fcl\u00f6nbs\u00e9gek alig \u00e9szlelhet\u0151k, \u00e9s csak alapos \u00f6sszehasonl\u00edt\u00f3 tanulm\u00e1nyoz\u00e1ssal der\u00edthet\u0151k ki a terjedelmes dokument\u00e1ci\u00f3ban. Vagy amikor megpr\u00f3b\u00e1lod portolni a t\u00f6k\u00e9letesen m\u0171k\u00f6d\u0151 Firebase k\u00f3dot, hogy az Firestore-ban is m\u0171k\u00f6dj\u00f6n. M\u00e1r akkor kider\u00fcl, hogy az adatb\u00e1zis fel\u00fclete l\u00e1ngra lobban, amint megpr\u00f3b\u00e1lod az eg\u00e9rrel val\u00f3s id\u0151ben \u00e1th\u00fazni. Ism\u00e9tlem, nem viccelek.<\/p>\n<p>A Firebase kliens udvarias abban az \u00e9rtelemben, hogy pufferezi a m\u00f3dos\u00edt\u00e1sokat \u00e9s automatikus ism\u00e9tl\u00e9si k\u00eds\u00e9rleteket hajt v\u00e9gre, ahol az utols\u00f3 \u00edr\u00e1si m\u0171velet \u00e9lvez priorit\u00e1st. Azonban a Firestore-nak van egy korl\u00e1toz\u00e1sa, miszerint 1 \u00edr\u00e1si m\u0171velet lehet egy dokumentummal egy felhaszn\u00e1l\u00f3ra m\u00e1sodpercenk\u00e9nt, \u00e9s ezt a korl\u00e1toz\u00e1st a szerver alkalmazza. Amikor ezzel dolgozol, neked magadnak kell megtal\u00e1lnod a m\u00f3dj\u00e1t, hogy kij\u00e1tszd, \u00e9s megval\u00f3s\u00edtsd a friss\u00edt\u00e9si r\u00e1ta korl\u00e1toz\u00f3t, m\u00e9g akkor is, amikor csak az alkalmaz\u00e1sod l\u00e9trehoz\u00e1s\u00e1ra pr\u00f3b\u00e1lsz t\u00f6rekedni. Teh\u00e1t a Firestore egy val\u00f3s idej\u0171 adatb\u00e1zis, amely val\u00f3s idej\u0171 kliens n\u00e9lk\u00fcl m\u0171k\u00f6dik, amely API-n kereszt\u00fcl \u00e1lc\u00e1zza mag\u00e1t.<\/p>\n<p>Ezen kezdj\u00fck l\u00e1tni a Firestore l\u00e9tez\u00e9s\u00e9nek els\u0151 jeleit. Lehet, hogy t\u00e9vedek, de gyan\u00edtom, hogy valaki a Google vezet\u00e9s\u00e9ben, miut\u00e1n megv\u00e1s\u00e1rolt\u00e1k a Firebase-t, egyszer\u0171en azt mondta: \u201eNem, istenem, nem. Ez elfogadhatatlan. Csak ne az \u00e9n ir\u00e1ny\u00edt\u00e1som alatt.\u201d<\/p>\n<p><img decoding=\"async\" alt=\"Ez az adatb\u00e1zis l\u00e1ngol...\" src=\"\/wp-content\/uploads\/2020\/10\/fbb5ce5ff93b4e3a7bdcd12cce3bdd92.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nKij\u00f6tt a szob\u00e1j\u00e1b\u00f3l, \u00e9s azt hirdette:<\/p>\n<p><i>\u201eEgy nagy JSON dokumentum? Nem. K\u00fcl\u00f6n dokumentumokra kell bontanod az adatokat, mindegyik maximum 1 megab\u00e1jtos m\u00e9rettel.\u201d<\/i><\/p>\n<p>\u00dagy t\u0171nik, hogy egy ilyen korl\u00e1toz\u00e1s nem fogja t\u00fal\u00e9lni az els\u0151 tal\u00e1lkoz\u00e1st egy el\u00e9gg\u00e9 motiv\u00e1lt felhaszn\u00e1l\u00f3i b\u00e1zissal. Tudod, hogy \u00edgy van. N\u00e1lunk p\u00e9ld\u00e1ul t\u00f6bb mint ezer\u00f6tsz\u00e1z prezent\u00e1ci\u00f3 van, \u00e9s ez Teljesen Norm\u00e1lis.<\/p>\n<p>Egy ilyen korl\u00e1toz\u00e1ssal el kell fogadnod, hogy egy 'dokumentum' az adatb\u00e1zisban nem hasonl\u00edt majd arra az objektumra, amit a felhaszn\u00e1l\u00f3 dokumentumnak nevezne.<\/p>\n<p><i>\u201eT\u00f6mb\u00f6k t\u00f6mbje, amelyek rekurz\u00edvan m\u00e1s elemeket tartalmazhatnak? Nem. A t\u00f6mb\u00f6k csak fix hossz\u00fas\u00e1g\u00fa objektumokat vagy sz\u00e1mokat tartalmazhatnak, ahogyan azt az \u00dar megalkotta.\u201d<\/i><\/p>\n<p>Teh\u00e1t, ha azt rem\u00e9lted, hogy GeoJSON-t helyezhetsz a Firestore-ba, akkor felfedezed, hogy ez lehetetlen. Semmilyen nem egydimenzi\u00f3s dolog nem megengedett. Rem\u00e9lem, szeretsz Base64-et \u00e9s\/vagy JSON-t JSON-ban.<\/p>\n<p><i>\u201eJSON import\u00e1l\u00e1sa \u00e9s export\u00e1l\u00e1sa HTTP-n kereszt\u00fcl, parancssori eszk\u00f6z\u00f6k vagy adminisztr\u00e1ci\u00f3s panel? Nem. Csak a Google Cloud Storage-ba tudod export\u00e1lni \u00e9s import\u00e1lni az adatokat. \u00dagy t\u0171nik, most \u00edgy h\u00edvj\u00e1k. \u00c9s amikor azt mondom, hogy 'te', akkor csak azokra utalok, akik Project Owner hatalommal b\u00edrnak. Mindenki m\u00e1s menjen \u00e9s jegyeket hozzon l\u00e9tre.\u201d<\/i><\/p>\n<p>Ahogy l\u00e1tod, a FireBase adatmodellje k\u00f6nnyen le\u00edrhat\u00f3. Ez tartalmaz egy hatalmas JSON dokumentumot, amely a JSON kulcsokat \u00f6sszekapcsolja az URL utakkal. Ha ezt \u00edrod a <code>HTTP PUT<\/code> be. <code>\/<\/code> FireBase-nek:<\/p>\n<pre><code class=\"json\">{\n  \"hello\": \"vil\u00e1g\"\n}<\/code><\/pre>\n<p>\nAkkor <code>GET \/hello<\/code> visszaadja <code>\"vil\u00e1g\"<\/code>. Alapvet\u0151en \u00edgy m\u0171k\u00f6dik, ahogy v\u00e1rod. A FireBase objektumgy\u0171jtem\u00e9ny <code>\/my-collection\/:id<\/code> egyen\u00e9rt\u00e9k\u0171 egy JSON sz\u00f3t\u00e1rral <code>{ \"my-collection\": {...}}<\/code> a gy\u00f6k\u00e9rben, amelynek tartalma el\u00e9rhet\u0151 itt: <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>\nEz nagyszer\u0171en m\u0171k\u00f6dik, ha minden besz\u00far\u00e1s egyedi ID-vel rendelkezik, amire a rendszernek van egy szabv\u00e1nyos megold\u00e1sa.<\/p>\n<p>M\u00e1s szavakkal, az adatb\u00e1zis 100%-ban kompatibilis a JSON-nal (*) \u00e9s kiv\u00e1l\u00f3an m\u0171k\u00f6dik a HTTP-val, p\u00e9ld\u00e1ul a CouchDB-vel. De alapvet\u0151en val\u00f3s idej\u0171 API-n kereszt\u00fcl haszn\u00e1lja, amely elvonja a websockets, az azonos\u00edt\u00e1st \u00e9s az el\u0151fizet\u00e9seket. Az adminisztr\u00e1tori panel mindk\u00e9t lehet\u0151s\u00e9get biztos\u00edt, lehet\u0151v\u00e9 t\u00e9ve a val\u00f3s idej\u0171 szerkeszt\u00e9st \u00e9s a JSON import\u00e1l\u00e1s\u00e1t\/export\u00e1l\u00e1s\u00e1t. Ha a k\u00f3dj\u00e1ban ehhez fogja mag\u00e1t tartani, meglep\u0151dni fog, hogy mennyi speci\u00e1lis k\u00f3d t\u0171nik el, amikor r\u00e1j\u00f6n, hogy a JSON patch \u00e9s diff 90%-\u00e1t megoldja a rutin feladatoknak a tart\u00f3s \u00e1llapotok kezel\u00e9s\u00e9ben.<\/p>\n<p>A Firestore adatmodell hasonl\u00edt a JSON-ra, de n\u00e9h\u00e1ny alapvet\u0151 szempontb\u00f3l elt\u00e9r t\u0151le. M\u00e1r eml\u00edtettem, hogy nem l\u00e9teznek t\u00f6mb\u00f6k a t\u00f6mb\u00f6kben. A sub-collection model az, hogy ezek els\u0151 oszt\u00e1ly\u00fa fogalmak, k\u00fcl\u00f6n\u00e1ll\u00f3ak a tartalmaz\u00f3 JSON dokumentumt\u00f3l. Mivel erre nincs k\u00e9sz sz\u00e9rializ\u00e1ci\u00f3, az adatok lek\u00e9rdez\u00e9s\u00e9hez \u00e9s \u00edr\u00e1s\u00e1hoz k\u00fcl\u00f6nleges k\u00f3d v\u00e9grehajt\u00e1si \u00fatvonalra van sz\u00fcks\u00e9g. A saj\u00e1t gy\u0171jtem\u00e9nyek kezel\u00e9s\u00e9hez saj\u00e1t szkripteket \u00e9s eszk\u00f6z\u00f6ket kell \u00edrni. Az adminisztr\u00e1tori panel csak kis v\u00e1ltoztat\u00e1sokat tesz lehet\u0151v\u00e9, egy mez\u0151nk\u00e9nt, \u00e9s nem rendelkezik import\u00e1l\u00e1si\/export\u00e1l\u00e1si funkci\u00f3kkal.<\/p>\n<p>Egy val\u00f3s idej\u0171 NoSQL adatb\u00e1zist vettek, \u00e9s lass\u00fa nem-SQL-l\u00e9 alak\u00edtott\u00e1k \u00e1t, automatikus egyes\u00edt\u00e9ssel \u00e9s k\u00fcl\u00f6n oszloppal, ami nem JSON. <i>Valami hasonl\u00f3 a GraftQL-hoz<\/i>.<\/p>\n<p><img decoding=\"async\" alt=\"Ez az adatb\u00e1zis l\u00e1ngol...\" src=\"\/wp-content\/uploads\/2020\/10\/c6e842418996c96f1efa873774f35f44.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>Forr\u00f3 Java<\/h2>\n<p>\nHa a Firestone-nak megb\u00edzhat\u00f3bb\u00e1 \u00e9s sk\u00e1l\u00e1zhat\u00f3bb\u00e1 kellene v\u00e1lnia, akkor az ir\u00f3nia, hogy az \u00e1tlagos fejleszt\u0151 egy kev\u00e9sb\u00e9 megb\u00edzhat\u00f3 megold\u00e1st kap, mint a FireBase \u201edo boxb\u00f3l\u201d. Az a szoftver, amire a Morg\u00f3s Adatb\u00e1zis-adminisztr\u00e1tornak sz\u00fcks\u00e9ge van, olyan szint\u0171 er\u0151fesz\u00edt\u00e9seket \u00e9s szak\u00e9rtelmet ig\u00e9nyel, hogy ez egyszer\u0171en irre\u00e1lis a niche-ben, ahol felt\u00e9telezhet\u0151en j\u00f3 term\u00e9knek kell lennie. Olyan ez, mint amikor az HTML5 Canvas val\u00f3j\u00e1ban nem helyettes\u00edti a Flash-t, ha nincsenek fejleszt\u0151i eszk\u00f6z\u00f6k \u00e9s lej\u00e1tsz\u00f3. S\u0151t, a Firestore a tiszta adatok \u00e9s a steril valid\u00e1l\u00e1s ir\u00e1nti t\u00f6rekv\u00e9s\u00e9ben olyan m\u00e9lyre mer\u00fclt, ami egyszer\u0171en nem felel meg ahhoz, ahogyan az \u00e1tlagos \u00fczleti felhaszn\u00e1l\u00f3 <i>szeret dolgozni<\/i>: sz\u00e1m\u00e1ra ez nem k\u00f6telez\u0151, mert a v\u00e9gs\u0151kig minden v\u00e1zlat.<\/p>\n<p>A FireBase f\u0151 h\u00e1tr\u00e1nya, hogy az \u00fcgyf\u00e9l t\u00f6bb \u00e9vvel a hat\u00e1rid\u0151 el\u0151tt k\u00e9sz\u00fclt el, m\u00e9g miel\u0151tt a legt\u00f6bb webfejleszt\u0151 tudom\u00e1st szerzett volna a v\u00e1ltozatlans\u00e1gr\u00f3l. Emiatt a FireBase azt felt\u00e9telezi, hogy adatokat fog m\u00f3dos\u00edtani, ez\u00e9rt nem haszn\u00e1lja ki a felhaszn\u00e1l\u00f3 \u00e1ltal biztos\u00edtott v\u00e1ltozatlans\u00e1g el\u0151nyeit. Ezen k\u00edv\u00fcl nem haszn\u00e1lja \u00fajra az adatokat a felhaszn\u00e1l\u00f3nak \u00e1tadott pillanatk\u00e9peken, ami megnehez\u00edti a k\u00fcl\u00f6nbs\u00e9gek meg\u00e1llap\u00edt\u00e1s\u00e1t. Nagyobb dokumentumok eset\u00e9n a m\u00f3dos\u00edt\u00e1sokra alapozott tranzakci\u00f3s mechanizmusa egyszer\u0171en nem elegend\u0151. Fi\u00fak, m\u00e1r van nek\u00fcnk <code>WeakMap<\/code> JavaScriptben. Ez k\u00e9nyelmes.<\/p>\n<p>Ha megfelel\u0151 form\u00e1t adunk az adatoknak, \u00e9s nem tessz\u00fck t\u00fal naggy\u00e1 a f\u00e1kat, akkor ezt a probl\u00e9m\u00e1t meg lehet ker\u00fclni. De \u00e9rdekelne, hogy a FireBase sokkal \u00e9rdekesebb lenne-e, ha a fejleszt\u0151k kiadn\u00e1nak egy igaz\u00e1n j\u00f3 kliens API-t, amely a v\u00e1ltozatlans\u00e1got val\u00f3di adatb\u00e1zis-strukt\u00fara aj\u00e1nl\u00e1saival kombin\u00e1ln\u00e1. Ehelyett \u00fagy t\u0171nik, hogy megpr\u00f3b\u00e1lt\u00e1k megjav\u00edtani azt, ami nincs elromolva, \u00e9s ezzel csak rontottak rajta.<\/p>\n<p>Nem tudom az \u00f6sszes logik\u00e1t, ami a Firestore megalkot\u00e1s\u00e1nak h\u00e1tter\u00e9ben \u00e1llt. Az okokkal val\u00f3 elm\u00e9lked\u00e9s egy fekete dobozban sz\u00f3rakoztat\u00f3 r\u00e9sz is. Az ilyen k\u00e9t rendk\u00edv\u00fcl hasonl\u00f3, de \u00f6sszehasonl\u00edthatatlan adatb\u00e1zis ellent\u00e9te el\u00e9g ritka. Mintha valaki azt gondolta volna: <i>\u201eA Firebase csak egy funkci\u00f3, amelyet a Google Cloudban tudunk \u00e9m\u00e1liz\u00e1lni\u201d<\/i>, de m\u00e9g nem fedezte fel a val\u00f3s vil\u00e1g ig\u00e9nyeinek meghat\u00e1roz\u00e1s\u00e1nak vagy olyan hasznos megold\u00e1sok l\u00e9trehoz\u00e1s\u00e1nak koncepci\u00f3j\u00e1t, amelyek megfelelnek minden ilyen k\u00f6vetelm\u00e9nynek. <i>\u201eA fejleszt\u0151k majd gondolkodjanak ezen. Csak csin\u00e1ljatok egy sz\u00e9p UI-t\u2026 \u00c9s lehet, hogy tegy\u00fcnk r\u00e1 t\u00f6bb t\u00fczet?\u201d<\/i><\/p>\n<p>Tudok p\u00e1r dolgot az adatstrukt\u00far\u00e1kr\u00f3l. Pontosan l\u00e1tom, hogy a \u201emindent egy nagy JSON f\u00e1ban\u201d koncepci\u00f3 megpr\u00f3b\u00e1lja az adatb\u00e1zisb\u00f3l b\u00e1rmilyen nagyszab\u00e1s\u00fa strukt\u00far\u00e1val kapcsolatos \u00e9rz\u00e9st elt\u00fcntetni. Elv\u00e1rni, hogy a szoftver egyszer\u0171en kezelni tudja a k\u00e9tes adatstrukt\u00far\u00e1kra \u00e9p\u00fcl\u0151 frakt\u00e1lokat, egyszer\u0171en \u0151r\u00fclts\u00e9g. M\u00e9g csak k\u00e9pzelni sem kell, mennyire rossz lehet a helyzet, mivel szigor\u00fa k\u00f3dellen\u0151rz\u00e9seket v\u00e9geztem \u00e9s <i>l\u00e1ttam olyan dolgokat, amikr\u0151l ti, emberek, m\u00e9g \u00e1lmodni sem mertetek<\/i>. De tudom, hogyan n\u00e9z ki egy j\u00f3 strukt\u00fara, <noindex><a rel=\"nofollow\" href=\"https:\/\/acko.net\/blog\/apis-are-about-policy\">hogyan haszn\u00e1lhat\u00f3<\/a><\/noindex> \u00e9s <noindex><a rel=\"nofollow\" href=\"https:\/\/acko.net\/blog\/software-development-as-advanced-damage-control\/\">mi\u00e9rt fontos ezt csin\u00e1lni<\/a><\/noindex>Elk\u00e9pzelhetek egy olyan vil\u00e1got, ahol a Firestore teljesen logikusnak t\u0171nne, \u00e9s az azt l\u00e9trehoz\u00f3 emberek \u00fagy v\u00e9ln\u00e9k, hogy j\u00f3l v\u00e9gezt\u00e9k a munk\u00e1jukat. De mi nem ebben a vil\u00e1gban \u00e9l\u00fcnk.<\/p>\n<p>A FireBase query-k \u00e9p\u00edt\u00e9s\u00e9nek t\u00e1mogat\u00e1sa minden standard szerint rossz, szinte nem is l\u00e9tezik. Hat\u00e1rozottan jav\u00edt\u00e1sra vagy legal\u00e1bb fel\u00fclvizsg\u00e1latra szorul. A Firestore sem sokkal jobb, mivel meg van k\u00f6tve az egyszer\u0171 SQL hasonl\u00f3 egy dimenzi\u00f3s indexeivel. Ha olyan lek\u00e9rdez\u00e9sekre van sz\u00fcks\u00e9ge, amelyeket az emberek v\u00e9geznek kaotikus adatokkal, akkor teljessz\u00f6veg-keres\u00e9sre, t\u00f6bbsz\u00f6r\u00f6s tartom\u00e1ny sz\u0171r\u0151kre \u00e9s tetsz\u00e9s szerinti felhaszn\u00e1l\u00f3i sorrendre van sz\u00fcks\u00e9g. A sima SQL funkci\u00f3kat alaposan megvizsg\u00e1lva \u00f6nmagukban t\u00fal korl\u00e1tozottak. Tov\u00e1bb\u00e1, az egyetlen SQL lek\u00e9rdez\u00e9sek, amelyeket az emberek produkci\u00f3ban v\u00e9grehajtanak, a gyors lek\u00e9rdez\u00e9sek. Sz\u00fcks\u00e9ge lesz egy speci\u00e1lis indexel\u00e9si megold\u00e1sra \u00e1tgondolt adatszerkezetekkel. Minden m\u00e1shoz legal\u00e1bb fokozatos Map-Reduce-ra vagy valami hasonl\u00f3ra lesz sz\u00fcks\u00e9ge.<\/p>\n<p>Ha inform\u00e1ci\u00f3t keres err\u0151l a Google dokumentumaiban, rem\u00e9lhet\u0151leg egy BigTable vagy BigQuery fel\u00e9 ir\u00e1ny\u00edtanak. Azonban ezekhez a megold\u00e1sokhoz annyi s\u0171r\u0171 v\u00e1llalati zsargon kapcsol\u00f3dik, hogy gyorsan visszat\u00e9rsz, \u00e9s elkezdesz valami m\u00e1st keresni.<\/p>\n<p>Az utols\u00f3 dolog, amire egy val\u00f3s idej\u0171 adatb\u00e1zis eset\u00e9n sz\u00fcks\u00e9ged van \u2014 az valami, amit emberek hoztak l\u00e9tre \u00e9s emberek sz\u00e1m\u00e1ra k\u00e9sz\u00fclt, mik\u00f6zben a fizet\u00e9sek alapj\u00e1n dolgoznak.<\/p>\n<p><i>(*) Ez vicc, nincs olyan fogalom, mint <noindex><a rel=\"nofollow\" href=\"http:\/\/seriot.ch\/parsing_json.php\">100% JSON kompatibilit\u00e1s<\/a><\/noindex>.<\/i><\/p>\n<p><\/p>\n<h4>Hirdet\u00e9s<\/h4>\n<p>\nKeresed <noindex><a rel=\"nofollow\" href=\"https:\/\/vdsina.ru\/cloud-servers?partner=habr130\">VDS<\/a><\/noindex> egy debug projektekhez, fejleszt\u0151i \u00e9s hosting szervert? Akkor te biztosan a mi \u00fcgyfel\u00fcnk vagy \ud83d\ude42 Napid\u00edjas szerverek k\u00fcl\u00f6nb\u00f6z\u0151 konfigur\u00e1ci\u00f3kban, antiDDoS \u00e9s Windows licencek is benne vannak az \u00e1rban.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/vdsina.ru\/cloud-servers?partner=habr130\"><img decoding=\"async\" alt=\"Ez az adatb\u00e1zis l\u00e1ngol...\" src=\"\/wp-content\/uploads\/2020\/10\/f1215924e9c1c41d00f7c71c6c569aa4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><br \/>\n<br \/>Forr\u00e1s: <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\/hu\/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=\"hu_HU\" \/>\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\/hu\/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\udd47Ez az adatb\u00e1zis l\u00e1ngokban \u00e1ll\u2026 | ProHoster","description":"Engedd meg, hogy mes\u00e9ljek egy technikai t\u00f6rt\u00e9netet. Sok \u00e9vvel ezel\u0151tt.","canonical_url":"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/eta-baza-dannyh-v-ogne","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"hu_HU","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\/hu\/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\/hu\/wp-json\/wp\/v2\/posts\/96465","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/comments?post=96465"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts\/96465\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/media\/96466"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/media?parent=96465"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/categories?post=96465"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/tags?post=96465"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}