{"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\/ro\/blog\/administrirovanie\/eta-baza-dannyh-v-ogne","title":{"rendered":"Aceast\u0103 baz\u0103 de date este \u00een fl\u0103c\u0103ri\u2026","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Aceast\u0103 baz\u0103 de date este \u00een fl\u0103c\u0103ri\u2026\" src=\"\/wp-content\/uploads\/2020\/10\/e4e39a7039dad14422fd83c05f114d6f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPermite\u021bi-mi s\u0103 v\u0103 istorisesc o poveste tehnic\u0103.<\/p>\n<p>Cu mul\u021bi ani \u00een urm\u0103, am dezvoltat o aplica\u021bie cu func\u021bionalit\u0103\u021bi integrate de colaborare. A fost un stiv experimentat convenabil, care a folosit pe deplin poten\u021bialul React-ului timpuriu \u0219i CouchDB. Aceasta sincroniza datele \u00een timp real prin JSON. <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Operational_transformation\">OT<\/a><\/noindex>. A fost utilizat\u0103 \u00een activit\u0103\u021bile interne ale companiei, dar aplicabilitatea sa larg\u0103 \u0219i poten\u021bialul \u00een alte domenii erau evidente.<\/p>\n<p>\u00cencerc\u00e2nd s\u0103 vindem aceast\u0103 tehnologie poten\u021bialilor clien\u021bi, ne-am confruntat cu un obstacol neprev\u0103zut. \u00cen videoclipul de demonstratie, tehnologia noastr\u0103 ar\u0103ta \u0219i func\u021biona excelent, f\u0103r\u0103 nicio problem\u0103. Videoclipul ar\u0103ta exact cum func\u021bioneaz\u0103, f\u0103r\u0103 simul\u0103ri. Am conceput \u0219i codificat un scenariu realist de utilizare a programului.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\n<img decoding=\"async\" alt=\"Aceast\u0103 baz\u0103 de date este \u00een fl\u0103c\u0103ri\u2026\" src=\"\/wp-content\/uploads\/2020\/10\/ea517a6aee0b015dc4d7bad4e86af6f4.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDe fapt, aceasta a devenit problema. Demo-ul nostru func\u021biona exact ca \u0219i cum ar fi simulat modul \u00een care func\u021bioneaz\u0103 aplica\u021biile altora. Concret, informa\u021biile erau transmise instantaneu de la A la B, chiar \u0219i \u00een cazul fi\u0219ierelor media mari. Dup\u0103 autentificare, fiecare utilizator vedea \u00eenregistr\u0103rile noi. Prin intermediul aplica\u021biei, utilizatorii diferi\u021bi puteau colabora cu claritate la acelea\u0219i proiecte, chiar \u0219i \u00een cazul unei conexiuni la Internet \u00eentrerupte undeva \u00eentr-un sat. \u00cen mod indirect, acest lucru este sugerat \u00een orice videoclip editat \u00een After Effects despre produs.<\/p>\n<p>De\u0219i toat\u0103 lumea \u0219tia la ce servea butonul Refresh, nimeni nu \u00een\u021belegea deloc c\u0103 aplica\u021biile web, pe care ni le cer s\u0103 le dezvolt\u0103m, sunt de obicei supuse propriilor limit\u0103ri. \u0218i c\u0103, dac\u0103 acestea nu mai sunt necesare, experien\u021ba utilizatorului va fi complet diferit\u0103. \u00cen general, observau c\u0103 pot 'conversa', l\u0103s\u00e2nd note partenerilor de dialog, motiv pentru care se \u00eentrebau \u00een ce difer\u0103 aceasta de Slack, de exemplu. Uf!<\/p>\n<h2>Designul sincroniilor zilnice<\/h2>\n<p>\nDac\u0103 ave\u021bi deja experien\u021b\u0103 \u00een dezvoltarea de software, atunci ar trebui s\u0103 v\u0103 enerveze necesitatea de a \u021bine minte c\u0103 majoritatea oamenilor nu pot pur \u0219i simplu s\u0103 priveasc\u0103 o imagine a interfe\u021bei \u0219i s\u0103 \u00een\u021beleag\u0103 ce va face aceasta atunci c\u00e2nd interac\u021bioneaz\u0103 cu ea. Nemaivorbind de ceea ce se \u00eent\u00e2mpl\u0103 \u00een interiorul programului. Cunoa\u0219terea a ceea ce <i>poate<\/i> va avea loc este \u00een mare parte rezultatul cunoa\u0219terii a ceea ce nu poate avea loc \u0219i ce nu ar trebui s\u0103 se \u00eent\u00e2mple. Acest lucru necesit\u0103 <noindex><a rel=\"nofollow\" href=\"https:\/\/uxdesign.cc\/design-of-everyday-things-chapter-01-summary-and-keypoints-664d426a11e0\">model mental\u0103<\/a><\/noindex> nu doar ceea ce face software-ul, ci \u0219i modul \u00een care p\u0103r\u021bile sale sunt sincronizate \u0219i comunic\u0103 \u00eentre ele.<\/p>\n<p>Un exemplu clasic este utilizatorul care, timp de dou\u0103zeci de minute, se uit\u0103 la <i>spinner.gif<\/i>, \u00eentreb\u00e2ndu-se c\u00e2nd, \u00een sf\u00e2r\u0219it, va termina procesul. Dezvoltatorul ar fi realizat c\u0103 procesul este probabil blocat, iar gif-ul nu va disp\u0103rea niciodat\u0103 de pe ecran. Aceast\u0103 anima\u021bie imit\u0103 finalizarea lucr\u0103rii, dar nu este legat\u0103 de starea acesteia. \u00cen astfel de cazuri, unii speciali\u0219ti tehnici ador\u0103 s\u0103 r\u0103sufle din umeri, surprin\u0219i de gradul de confuzie al utilizatorilor. Dar observa\u021bi, cine dintre ei ar ar\u0103ta la ceasurile care se rotesc \u0219i ar spune c\u0103 de fapt stau nemi\u0219cate?<\/p>\n<p><img decoding=\"async\" alt=\"Aceast\u0103 baz\u0103 de date este \u00een fl\u0103c\u0103ri\u2026\" src=\"\/wp-content\/uploads\/2020\/10\/db67c48846549b272a367c0a37aec97b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAceasta este esen\u021ba valorii timpului real. \u00cen zilele noastre, bazele de date \u00een timp real \u00eenc\u0103 sunt folosite foarte pu\u021bin \u0219i multe dintre ele sunt privite cu suspiciune. Cele mai multe dintre aceste baze de date tind s\u0103 se \u00eendrepte spre stilul NoSQL, ceea ce duce de obicei la utilizarea solu\u021biilor bazate pe Mongo, despre care ar fi mai bine s\u0103 uit\u0103m. Totu\u0219i, pentru mine, aceasta \u00eenseamn\u0103 confortul lucrului cu CouchDB, precum \u0219i studierea proiect\u0103rii structurilor care vor putea fi completate cu date nu doar de un birocrat. Cred c\u0103 \u00eemi folosesc timpul mai eficient.<\/p>\n<p>Dar adev\u0103rata tem\u0103 a acestui articol este ceea ce folosesc ast\u0103zi. Nu din alegerea mea, ci din cauza unei politici corporative aplicate indiferent \u0219i \u00een mod orb. Prin urmare, voi face o Compara\u021bie Complet Onest\u0103 \u0219i Impartial\u0103 a dou\u0103 produse str\u00e2ns legate pentru lucrul cu bazele de date \u00een timp real Google.<\/p>\n<p><img decoding=\"async\" alt=\"Aceast\u0103 baz\u0103 de date este \u00een fl\u0103c\u0103ri\u2026\" src=\"\/wp-content\/uploads\/2020\/10\/89432de9501b7667f8e187d14afc8897.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAmbele titluri con\u021bin cuv\u00e2ntul Fire. Unul \u00eemi aminte\u0219te cu dragoste. Cel\u0103lalt pentru mine este un alt tip de foc. Nu m\u0103 gr\u0103besc s\u0103 pronun\u021b numele lor, deoarece, odat\u0103 ce o fac, ne vom confrunta cu prima mare problem\u0103 \u2013 numele.<\/p>\n<p>Primul se nume\u0219te <i>Firebase Real-Time Database<\/i>, iar al doilea \u2013 <i>Firebase Cloud Firestore<\/i>. Ambele sunt produse din <i>Firebase suite<\/i> Google. API-urile lor se numesc, respectiv, <code>firebase.database(\u2026)<\/code> \u0219i <code>firebase.firestore(\u2026)<\/code>.<\/p>\n<p>Aceasta s-a \u00eent\u00e2mplat pentru c\u0103 <i>Real-Time Database<\/i> \u2013 este pur \u0219i simplu versiunea ini\u021bial\u0103 a <i>Firebase<\/i> \u00eenainte de achizi\u021bia sa de c\u0103tre Google \u00een 2014. Apoi, Google a decis s\u0103 creeze un produs paralel care s\u0103 fie o <i>copie<\/i> Firebase pe baza big data a companiei, numindu-l Firestore cu un nor. Sper c\u0103 nu te-ai pierdut \u00eenc\u0103. Dac\u0103 totu\u0219i te-ai pierdut, nu-\u021bi face griji, am rescris aceast\u0103 parte a articolului de zece ori.<\/p>\n<p>Pentru c\u0103 trebuie s\u0103 specifici <i>Firebase<\/i> \u00een ceea ce prive\u0219te Firebase \u0219i <i>Firestore<\/i> \u00een leg\u0103tur\u0103 cu Firebase, cel pu\u021bin pentru a fi \u00een\u021beles acum c\u00e2\u021biva ani pe Stack Overflow.<\/p>\n<p>Dac\u0103 ar exista un premiu pentru cel mai prost nume al produselor software, acest caz ar fi cu siguran\u021b\u0103 unul dintre candida\u021bi. Distan\u021ba Hamming dintre aceste denumiri este at\u00e2t de mic\u0103 \u00eenc\u00e2t \u00eei confuzeaz\u0103 chiar \u0219i pe inginerii experimenta\u021bi, al c\u0103ror degete tasteaz\u0103 un nume, de\u0219i mintea g\u00e2nde\u0219te la altul. Acestea sunt planuri e\u0219uate cu zgomot, concepute cu cele mai bune inten\u021bii; ele au \u00eemplinit profe\u021bia c\u0103 baza de date va fi \u00een fl\u0103c\u0103ri. \u0218i nu glumesc. Persoana care a creat un astfel de sistem de numire a fost cauza s\u00e2ngelui, transpira\u021biei \u0219i lacrimilor.<\/p>\n<p><img decoding=\"async\" alt=\"Aceast\u0103 baz\u0103 de date este \u00een fl\u0103c\u0103ri\u2026\" src=\"\/wp-content\/uploads\/2020\/10\/b793ce183c5d0477c32c87f64bce5879.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>O victorie Pyrrhic\u0103<\/h2>\n<p>\nS-ar putea crede c\u0103 Firestore este <i>o \u00eenlocuire<\/i> pentru Firebase, urma\u0219ul s\u0103u de genera\u021bie urm\u0103toare, dar ar fi o eroare. Firestore cu siguran\u021b\u0103 nu se potrive\u0219te rolului de \u00eenlocuire pentru Firebase. Se pare c\u0103 cineva a scos din el tot ce este interesant \u0219i a complicat cea mai mare parte a ceea ce a mai r\u0103mas \u00een diferite moduri.<\/p>\n<p>Cu toate acestea, o privire rapid\u0103 asupra celor dou\u0103 produse poate s\u0103 te confuzeze: pare c\u0103 fac acela\u0219i lucru, prin API-uri \u00een mare parte identice \u0219i chiar \u00een aceea\u0219i sesiune de baze de date. Diferen\u021bele sunt greu de remarcat \u0219i sunt descoperite doar printr-o examinare atent\u0103 a documenta\u021biei voluminoase. Sau c\u00e2nd \u00eencerci s\u0103 portezi un cod care func\u021bioneaz\u0103 perfect pe Firebase, pentru a-l face s\u0103 func\u021bioneze cu Firestore. Deja atunci \u00ee\u021bi dai seama c\u0103 interfa\u021ba bazei de date se activeaz\u0103 de fiecare dat\u0103 c\u00e2nd \u00eencerci s\u0103 efectuezi un drag-and-drop \u00een timp real. Repet, nu glumesc.<\/p>\n<p>Clientul Firebase este politicos \u00een sensul c\u0103 bufferizeaz\u0103 modific\u0103rile \u0219i efectueaz\u0103 o repetare automat\u0103 a \u00eencerc\u0103rilor de actualizare, d\u00e2nd prioritate ultimei opera\u021biuni de scriere. Cu toate acestea, Firestore are o limitare de 1 opera\u021biune de scriere pe document pe utilizator pe secund\u0103, iar aceast\u0103 limitare este impus\u0103 de server. C\u00e2nd lucrezi cu el, trebuie s\u0103 g\u0103se\u0219ti singur o modalitate de a o ocoli \u0219i de a implementa un limitator al ratei de actualiz\u0103ri, chiar \u0219i atunci c\u00e2nd \u00eencerci s\u0103 creezi aplica\u021bia ta. Adic\u0103 Firestore este o baz\u0103 de date \u00een timp real f\u0103r\u0103 client \u00een timp real, care se mascheaz\u0103 sub ea prin API.<\/p>\n<p>Aici \u00eencepem s\u0103 vedem primele semne ale sensului existen\u021bei Firestore. Poate c\u0103 m\u0103 \u00een\u0219el, dar b\u0103nuiesc c\u0103 cineva sus \u00een conducerea Google s-a uitat dup\u0103 achizi\u021bia Firebase \u0219i a spus: \u201eNu, Dumnezeule, nu. Asta e inacceptabil. Numai s\u0103 nu sub conducerea mea.\u201d<\/p>\n<p><img decoding=\"async\" alt=\"Aceast\u0103 baz\u0103 de date este \u00een fl\u0103c\u0103ri\u2026\" src=\"\/wp-content\/uploads\/2020\/10\/fbb5ce5ff93b4e3a7bdcd12cce3bdd92.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nS-a f\u0103cut auzit din \u00eenc\u0103perile sale \u0219i a proclamat:<\/p>\n<p><i>\u201eUn singur document JSON de mari dimensiuni? Nu. Vei \u00eemp\u0103r\u021bi datele \u00een documente separate, fiecare cu o dimensiune de maximum 1 megabyte.\u201d<\/i><\/p>\n<p>Se pare c\u0103 aceast\u0103 restric\u021bie nu va supravie\u021bui primei \u00eent\u00e2lniri cu orice baz\u0103 de utilizatori suficient de motivat\u0103. \u0218ti\u021bi c\u0103 a\u0219a este. La noi la munc\u0103, de exemplu, avem mai mult de o mie \u0219i jum\u0103tate de prezent\u0103ri, \u0219i asta este complet normal.<\/p>\n<p>Cu o astfel de restric\u021bie, va trebui s\u0103 te \u00eempaci cu faptul c\u0103 un \u201edocument\u201d din baza de date nu va sem\u0103na deloc cu un obiect pe care utilizatorul l-ar putea numi document.<\/p>\n<p><i>\u201eMase de mase, care pot con\u021bine recursiv alte elemente? Nu. Masele vor con\u021bine doar obiecte sau numere de lungime fix\u0103, a\u0219a cum a fost g\u00e2ndit de Domnul.\u201d<\/i><\/p>\n<p>A\u0219a c\u0103 dac\u0103 sperai s\u0103 \u00eencorporezi GeoJSON \u00een Firestore-ul t\u0103u, vei descoperi c\u0103 este imposibil. Nimic multidimensional nu este permis. Sper c\u0103 \u00ee\u021bi place Base64 \u0219i\/sau JSON \u00een interiorul JSON-ului.<\/p>\n<p><i>\u201eImportul \u0219i exportul JSON prin HTTP, instrumente de linie de comand\u0103 sau panouri de administrare? Nu. Vei putea doar s\u0103 expor\u021bi \u0219i s\u0103 impor\u021bi date \u00een Google Cloud Storage. A\u0219a pare c\u0103 se nume\u0219te acum. \u0218i c\u00e2nd spun \u201etu\u201d, m\u0103 adresez doar celor care au privilegiul de Project Owner. To\u021bi ceilal\u021bi pot merge s\u0103 creeze bilete.\u201d<\/i><\/p>\n<p>Dup\u0103 cum vede\u021bi, modelul de date FireBase este u\u0219or de descris. Acesta con\u021bine un singur document JSON uria\u0219, care leag\u0103 cheile JSON de c\u0103ile URL. Dac\u0103 scrii folosind <code>HTTP PUT<\/code> \u00een <code>\/<\/code> FireBase urm\u0103torul text:<\/p>\n<pre><code class=\"json\">{\n  \"hello\": \"lume\"\n}<\/code><\/pre>\n<p>\nAtunci <code>GET \/hello<\/code> va returna <code>\"lume\"<\/code>. \u00cen esen\u021b\u0103, func\u021bioneaz\u0103 exact a\u0219a cum te a\u0219tep\u021bi. Colec\u021bia de obiecte FireBase <code>\/my-collection\/:id<\/code> este echivalent\u0103 cu un dic\u021bionar JSON <code>{\"my-collection\": {...}}<\/code> \u00een r\u0103d\u0103cin\u0103, con\u021binutul c\u0103ruia este disponibil \u00een <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>\nFunc\u021bioneaz\u0103 excelent dac\u0103 fiecare inser\u021bie are ID-uri f\u0103r\u0103 coliziuni, pentru care \u00een sistem exist\u0103 o solu\u021bie standard.<\/p>\n<p>Cu alte cuvinte, baza de date este 100% compatibil\u0103 cu JSON (*) \u0219i func\u021bioneaz\u0103 excelent cu HTTP, de exemplu, cu CouchDB. \u00cens\u0103, \u00een principal, o folosi\u021bi prin API-ul \u00een timp real, care abstreaz\u0103 websockets, autorizarea \u0219i abonamentele. Panoul de administrare are ambele capacit\u0103\u021bi, permi\u021b\u00e2nd at\u00e2t editarea \u00een timp real, c\u00e2t \u0219i importul\/exportul JSON. Dac\u0103 v\u0103 ve\u021bi men\u021bine acela\u0219i principiu \u00een codul vostru, ve\u021bi fi uimi\u021bi de c\u00e2t de mult cod specializat va disp\u0103rea atunci c\u00e2nd ve\u021bi \u00een\u021belege c\u0103 patch \u0219i diff JSON permit rezolvarea a 90% din sarcinile de rutin\u0103 legate de gestionarea st\u0103rii persistente.<\/p>\n<p>Modelul de date Firestore este similar cu JSON, dar se deosebe\u0219te \u00een c\u00e2teva aspecte critice. Am men\u021bionat deja absen\u021ba tablourilor \u00een interiorul altor tablouri. Modelul sub-collec\u021biilor este c\u0103 acestea sunt concepte de prim\u0103 clas\u0103, separate de documentul JSON care le con\u021bine. Deoarece nu exist\u0103 o serializare gata f\u0103cut\u0103 pentru aceasta, pentru a ob\u021bine \u0219i a scrie date, este nevoie de un parcurs de execu\u021bie a codului specializat. Pentru a gestiona propriile colec\u021bii, trebuie s\u0103 scrie\u021bi scripturi \u0219i instrumente proprii. Panoul de administrare v\u0103 permite s\u0103 face\u021bi doar modific\u0103ri minore, c\u00e2te un c\u00e2mp pe r\u00e2nd, \u0219i nu are func\u021bii de import\/export.<\/p>\n<p>Ei au transformat o baz\u0103 de date NoSQL \u00een timp real \u00eentr-o solu\u021bie lent\u0103 non-SQL cu auto-uniune \u0219i o coloan\u0103 separat\u0103 non-JSON. <i>Ceva de genul GraftQL<\/i>.<\/p>\n<p><img decoding=\"async\" alt=\"Aceast\u0103 baz\u0103 de date este \u00een fl\u0103c\u0103ri\u2026\" src=\"\/wp-content\/uploads\/2020\/10\/c6e842418996c96f1efa873774f35f44.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>Java fierbinte<\/h2>\n<p>\nDac\u0103 Firestore ar trebui s\u0103 devin\u0103 mai fiabil \u0219i scalabil, ironia este c\u0103 developerul mediu va ob\u021bine o solu\u021bie mai pu\u021bin fiabil\u0103 dec\u00e2t dac\u0103 aleg FireBase \u201edin cutie\u201d. Software-ul necesar pentru un Administrator de Baze de Date Queeny necesit\u0103 un nivel de efort \u0219i expertiz\u0103 at\u00e2t de ridicat \u00eenc\u00e2t este pur \u0219i simplu nerealist pentru ni\u0219a \u00een care, teoretic, ar trebui s\u0103 fie un produs bun. Este similar cu faptul c\u0103 HTML5 Canvas nu este o \u00eenlocuire pentru Flash, dac\u0103 nu exist\u0103 unelte de dezvoltare \u0219i un player. \u00cen plus, Firestore s-a \u00eempotmolit \u00een dorin\u021ba de a men\u021bine puritatea datelor \u0219i validarea steril\u0103, ceea ce pur \u0219i simplu nu corespunde modului \u00een care utilizatorul mediu de business <i>prefer\u0103 s\u0103 lucreze<\/i>: pentru el, totul este op\u021bional, deoarece p\u00e2n\u0103 la sf\u00e2r\u0219it, totul este un draft.<\/p>\n<p>Principala problem\u0103 a FireBase este c\u0103 clientul a fost creat cu c\u00e2\u021biva ani \u00eenainte de termenul s\u0103u, cu mult \u00eenainte ca majoritatea dezvoltatorilor web s\u0103 afle despre imutabilitate. Din acest motiv, FireBase presupune c\u0103 ve\u021bi modifica datele, a\u0219a c\u0103 nu beneficiaz\u0103 de avantajele imutabilit\u0103\u021bii asigurate de utilizator. \u00cen plus, nu reutilizeaz\u0103 datele \u00een instantaneele transmise utilizatorului, ceea ce face ca realizarea unui diff s\u0103 fie mult mai complicat\u0103. Pentru documente mari, mecanismul s\u0103u de tranzac\u021bii bazat pe difuri modificabile este pur \u0219i simplu inadecvat. Oameni buni, avem deja <code>WeakMap<\/code> \u00een JavaScript. Este convenabil.<\/p>\n<p>Dac\u0103 datele sunt formate corespunz\u0103tor \u0219i nu se fac arbori prea volumino\u0219i, problema poate fi evitat\u0103. Dar sunt curios dac\u0103 FireBase ar deveni mult mai interesant dac\u0103 dezvoltatorii ar lansa un API client adev\u0103rat care s\u0103 utilizeze imutabilitatea \u00eempreun\u0103 cu sfaturi practice serioase pentru structura bazelor de date. \u00cen schimb, se pare c\u0103 au \u00eencercat s\u0103 repare ceea ce nu era stricat, iar rezultatul a fost mai r\u0103u.<\/p>\n<p>Nu cunosc \u00eentreaga logic\u0103 din spatele cre\u0103rii Firestore. Ra\u021bionamentele despre motivele care apar \u00een interiorul unui cutie neagr\u0103 sunt \u0219i ele o parte a divertismentului. O astfel de opozi\u021bie \u00eentre dou\u0103 baze de date extrem de asem\u0103n\u0103toare, dar incomparabile, este destul de rar\u0103. Ca \u0219i cum cineva ar fi spus: <i>\u201eFirebase este pur \u0219i simplu o func\u021bie pe care o putem emula \u00een Google Cloud\u201d<\/i>, dar \u00een acela\u0219i timp, nu a descoperit \u00eenc\u0103 conceptul de determinare a cerin\u021belor din lumea real\u0103 sau de crearea de solu\u021bii utile care s\u0103 satisfac\u0103 toate aceste cerin\u021be. <i>\u201eL\u0103sa\u021bi dezvoltatorii s\u0103 se ocupe de asta. Face\u021bi UI frumos\u2026 Oare putem ad\u0103uga mai mult\u0103 flac\u0103r\u0103?\u201d<\/i><\/p>\n<p>\u00cen\u021beleg c\u00e2teva lucruri despre structuri de date. V\u0103d clar c\u0103 conceptul de \u201etotul \u00eentr-un singur arbore JSON mare\u201d este o \u00eencercare de a abstrahiza din baza de date orice sentiment de structur\u0103 pe scar\u0103 larg\u0103. A\u0219tept\u00e2nd ca software-ul s\u0103 fac\u0103 fa\u021b\u0103 oric\u0103rui fractal dubios al structurii de date este pur \u0219i simplu o nebunie. Nu trebuie s\u0103-mi imaginez c\u00e2t de r\u0103u poate fi totul, am realizat audite stricte de cod \u0219i <i>am v\u0103zut lucruri pe care voi, oamenii, nici m\u0103car nu le-a\u021bi visat.<\/i>Dar \u0219tiu \u0219i cum arat\u0103 structurile bune, <noindex><a rel=\"nofollow\" href=\"https:\/\/acko.net\/blog\/apis-are-about-policy\">cum s\u0103 le folosesc<\/a><\/noindex> \u0219i <noindex><a rel=\"nofollow\" href=\"https:\/\/acko.net\/blog\/software-development-as-advanced-damage-control\/\">de ce este necesar s\u0103 le facem.<\/a><\/noindex>. Pot s\u0103 \u00eemi imaginez o lume \u00een care Firestore ar p\u0103rea perfect logic, iar oamenii care l-au creat ar considera c\u0103 au f\u0103cut o treab\u0103 bun\u0103. Dar noi nu tr\u0103im \u00een aceast\u0103 lume.<\/p>\n<p>Suportul pentru construirea de interog\u0103ri \u00een FireBase este slab dup\u0103 orice standarde, practic nu exist\u0103. Definitiv necesit\u0103 \u00eembun\u0103t\u0103\u021biri sau cel pu\u021bin o revizuire. Dar Firestore nu este mult mai bun, deoarece este limitat de acelea\u0219i indici unidimensionali care exist\u0103 \u00een SQL simplu. Dac\u0103 ave\u021bi nevoie de interog\u0103ri, pe care oamenii le fac cu date haotice, atunci este necesar\u0103 c\u0103utarea textului complet, filtre pentru mai multe intervale \u0219i un ordin arbitrar specificat de utilizator. C\u00e2nd studiezi cu aten\u021bie, func\u021biile SQL simple sunt ele \u00eensele prea limitate. \u00cen plus, singurele interog\u0103ri SQL pe care oamenii le pot efectua \u00een produc\u021bie sunt interog\u0103rile rapide. Vei avea nevoie de o solu\u021bie specializat\u0103 pentru indexare cu structuri de date bine g\u00e2ndite. Pentru tot restul, ar trebui s\u0103 existe cel pu\u021bin un map-reduce incremental sau ceva similar.<\/p>\n<p>Dac\u0103 cau\u021bi informa\u021bii despre asta \u00een documentele Google, sper c\u0103 \u00ee\u021bi vor indica \u00eentr-o direc\u021bie de genul BigTable \u0219i BigQuery. Totu\u0219i, toate aceste solu\u021bii vin cu un volum de jargon corporatist at\u00e2t de dens, \u00eenc\u00e2t te vei \u00eentoarce rapid \u0219i vei \u00eencepe s\u0103 cau\u021bi altceva.<\/p>\n<p>Ultimul lucru de care ai nevoie \u00een cazul unei baze de date \u00een timp real este ceva creat de oameni, pentru oameni, care lucreaz\u0103 pe baza unui salariu pentru conducere.<\/p>\n<p><i>(*) Este o glum\u0103, nu exist\u0103 un concept de <noindex><a rel=\"nofollow\" href=\"http:\/\/seriot.ch\/parsing_json.php\">compatibilitate 100% cu JSON.<\/a><\/noindex>.<\/i><\/p>\n<p><\/p>\n<h4>\u00cen numele publicit\u0103\u021bii<\/h4>\n<p>\nCau\u021bi <noindex><a rel=\"nofollow\" href=\"https:\/\/vdsina.ru\/cloud-servers?partner=habr130\">VDS<\/a><\/noindex> pentru depanarea proiectelor, server pentru dezvoltare \u0219i g\u0103zduire? E\u0219ti exact clientul nostru \ud83d\ude42 Tarife pe zi pentru servere cu cele mai diverse configura\u021bii, antiDDoS \u0219i licen\u021be Windows sunt deja incluse \u00een pre\u021b.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/vdsina.ru\/cloud-servers?partner=habr130\"><img decoding=\"async\" alt=\"Aceast\u0103 baz\u0103 de date este \u00een fl\u0103c\u0103ri\u2026\" src=\"\/wp-content\/uploads\/2020\/10\/f1215924e9c1c41d00f7c71c6c569aa4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><br \/>\n<br \/>Sursa: <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.2.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u043e\u0437\u0432\u043e\u043b\u044c\u0442\u0435 \u043c\u043d\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0438\u0441\u0442\u043e\u0440\u0438\u044e. \u041c\u043d\u043e\u0433\u043e \u043b\u0435\u0442.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/eta-baza-dannyh-v-ogne\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\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\/ro\/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\udd47Aceast\u0103 baz\u0103 de date este \u00een fl\u0103c\u0103ri\u2026 | ProHoster","description":"Permite-mi s\u0103 \u00ee\u021bi spun o poveste tehnic\u0103. Acum mul\u021bi ani.","canonical_url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/eta-baza-dannyh-v-ogne","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"ro_RO","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\/ro\/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\/ro\/wp-json\/wp\/v2\/posts\/96465","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=96465"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/96465\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media\/96466"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=96465"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=96465"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=96465"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}