{"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\/sv\/blog\/administrirovanie\/eta-baza-dannyh-v-ogne","title":{"rendered":"Denna databas brinner...","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Denna databas brinner...\" src=\"\/wp-content\/uploads\/2020\/10\/e4e39a7039dad14422fd83c05f114d6f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nL\u00e5t mig ber\u00e4tta en teknisk historia.<\/p>\n<p>F\u00f6r m\u00e5nga \u00e5r sedan utvecklade jag en applikation med inbyggda samarbetsfunktioner. Det var en bekv\u00e4m experimentell stack som utnyttjade den fulla potentialen hos tidig React och CouchDB. Den synkroniserade data i realtid via JSON. <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Operational_transformation\">OT<\/a><\/noindex>. Den anv\u00e4ndes i f\u00f6retagets interna arbete, men det var uppenbart att dess breda till\u00e4mpbarhet och potential i andra omr\u00e5den var tydlig.<\/p>\n<p>N\u00e4r vi f\u00f6rs\u00f6kte s\u00e4lja denna teknik till potentiella kunder st\u00f6tte vi p\u00e5 ett ov\u00e4ntat hinder. I demovideon s\u00e5g v\u00e5r teknik ut att fungera utm\u00e4rkt, och det fanns inga problem h\u00e4r. Videon visade exakt hur det fungerade, och inget simulerades. Vi kom p\u00e5 och kodade ett realistiskt anv\u00e4ndningsscenario f\u00f6r programmet.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\n<img decoding=\"async\" alt=\"Denna databas brinner...\" src=\"\/wp-content\/uploads\/2020\/10\/ea517a6aee0b015dc4d7bad4e86af6f4.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nProblemet blev faktiskt just detta. V\u00e5r demo fungerade precis som alla andra som simulerade funktionerna i sina applikationer. Specifikt, informationen \u00f6verf\u00f6rdes omedelbart fr\u00e5n A till B, \u00e4ven om det handlade om stora mediafiler. Efter inloggning s\u00e5g varje anv\u00e4ndare nya poster. Med hj\u00e4lp av applikationen kunde olika anv\u00e4ndare samarbeta tydligt p\u00e5 samma projekt, \u00e4ven om internetanslutningen avbr\u00f6ts n\u00e5gonstans i byn. Detta underf\u00f6rst\u00e5tt \u00e4r vad som visas i vilket klipp som helst som klippts i After Effects om produkten.<\/p>\n<p>Trots att alla visste vad knappen Refresh var bra f\u00f6r, f\u00f6rstod ingen vad webbtj\u00e4nsterna de bad oss skapa vanligtvis var begr\u00e4nsade av. Och att om de inte l\u00e4ngre beh\u00f6vdes skulle anv\u00e4ndarupplevelsen se helt annorlunda ut. Oftast m\u00e4rkte de att man kunde 'chatta' och l\u00e4mna meddelanden till andra, s\u00e5 de undrade vad som skiljde sig fr\u00e5n exempelvis Slack. Uff!<\/p>\n<h2>Design av vardagliga synkroniseringar<\/h2>\n<p>\nOm du redan har erfarenhet av mjukvaruutveckling m\u00e5ste det irritera dig att komma ih\u00e5g att de flesta m\u00e4nniskor inte kan ta en titt p\u00e5 en sk\u00e4rmbild av gr\u00e4nssnittet och f\u00f6rst\u00e5 vad det kommer att g\u00f6ra n\u00e4r de interagerar med det. F\u00f6r att inte tala om vad som p\u00e5g\u00e5r inuti sj\u00e4lva programmet. Kunskapen om vad <i>hantera pl\u00f6tsliga kraschar och visa anv\u00e4ndbara detaljer f\u00f6r fels\u00f6kning, som stacktrace. Att skicka felmeddelanden har f\u00f6renklats \u2014 det r\u00e4cker att klicka p\u00e5 l\u00e4nken.<\/i> som kan h\u00e4nda \u00e4r till stor del resultaten av kunskapen om vad som inte kan h\u00e4nda och vad som inte b\u00f6r h\u00e4nda. Detta kr\u00e4vs. <noindex><a rel=\"nofollow\" href=\"https:\/\/uxdesign.cc\/design-of-everyday-things-chapter-01-summary-and-keypoints-664d426a11e0\">mental modell<\/a><\/noindex> inte bara vad programvaran g\u00f6r, utan ocks\u00e5 hur dess olika delar samverkar och kommunicerar.<\/p>\n<p>Ett klassiskt exempel p\u00e5 detta \u00e4r en anv\u00e4ndare som under tjugo minuter tittar p\u00e5 <i>spinner.gif<\/i>, och undrar n\u00e4r arbetet \u00e4ntligen kommer att slutf\u00f6ras. Utvecklaren skulle ha f\u00f6rst\u00e5tt att processen troligen har frusit, och att gif:en aldrig kommer att f\u00f6rsvinna fr\u00e5n sk\u00e4rmen. Denna animation imiterar ett arbete, men \u00e4r inte kopplad till dess tillst\u00e5nd. I s\u00e5dana fall brukar vissa tekniker rulla med \u00f6gonen, f\u00f6rv\u00e5nade \u00f6ver hur vilseledda anv\u00e4ndarna \u00e4r. Men m\u00e4rk vem av dem som pekar p\u00e5 de snurrande klockorna och s\u00e4ger att de faktiskt st\u00e5r stilla?<\/p>\n<p><img decoding=\"async\" alt=\"Denna databas brinner...\" src=\"\/wp-content\/uploads\/2020\/10\/db67c48846549b272a367c0a37aec97b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDet \u00e4r k\u00e4rnan i v\u00e4rdet av realtid. Idag anv\u00e4nds realtidsdatabaser fortfarande mycket lite, och m\u00e5nga \u00e4r misst\u00e4nksamma mot dem. De flesta s\u00e5dana databaser lutar sig aktivt mot NoSQL-stilen, vilket g\u00f6r att man ofta anv\u00e4nder l\u00f6sningar baserade p\u00e5 Mongo, som det \u00e4r b\u00e4st att gl\u00f6mma. Men f\u00f6r mig betyder det en bekv\u00e4m arbetsmilj\u00f6 med CouchDB, samt att studera design av strukturer som inte bara en byr\u00e5krat kan fylla med data. Jag tror att jag anv\u00e4nder min tid mer effektivt.<\/p>\n<p>Men \u00e4mnet f\u00f6r detta inl\u00e4gg \u00e4r vad jag faktiskt anv\u00e4nder idag. Inte av eget val, utan p\u00e5 grund av en likgiltig och blindt till\u00e4mpad f\u00f6retagsstrategi. D\u00e4rf\u00f6r kommer jag att ge en Helt \u00c4rlig och Opartisk j\u00e4mf\u00f6relse av tv\u00e5 n\u00e4ra relaterade produkter f\u00f6r att arbeta med realtidsdatabaser fr\u00e5n Google.<\/p>\n<p><img decoding=\"async\" alt=\"Denna databas brinner...\" src=\"\/wp-content\/uploads\/2020\/10\/89432de9501b7667f8e187d14afc8897.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nI b\u00e5da namnen finns ordet Fire. Det ena minns jag med \u00f6mhet. Det andra f\u00f6r mig \u00e4r en annan typ av eld. Jag skyndar mig inte att s\u00e4ga deras namn, eftersom s\u00e5 snart jag g\u00f6r det, kommer vi att m\u00f6ta det f\u00f6rsta stora problemet \u2014 namnen.<\/p>\n<p>Den f\u00f6rsta heter <i>Firebase Real-Time Database<\/i>, och den andra \u2014 <i>Firebase Cloud Firestore<\/i>. B\u00e5da \u00e4r produkter fr\u00e5n <i>Firebase suite<\/i> Google. Deras API:er heter, respektive, <code>firebase.database(\u2026)<\/code> och <code>firebase.firestore(\u2026)<\/code>.<\/p>\n<p>Det h\u00e4nde s\u00e5 att <i>Real-Time Database<\/i> \u00e4r helt enkelt originalet <i>Firebase<\/i> innan dess k\u00f6ptes av Google 2014. D\u00e4refter beslutade Google att skapa en parallell produkt som en kopia <i>av<\/i> Firebase baserat p\u00e5 f\u00f6retagets big data, och kallade den Firestore with a cloud. Jag hoppas att du inte blivit f\u00f6rvirrad. Om du trots allt har blivit f\u00f6rvirrad, oroa dig inte, jag har sj\u00e4lv skrivit om denna del av artikeln tio g\u00e5nger.<\/p>\n<p>F\u00f6r det \u00e4r viktigt att p\u00e5peka <i>Firebase<\/i> i fr\u00e5ga om Firebase, och <i>Firestore<\/i> i fr\u00e5ga om Firebase, \u00e5tminstone f\u00f6r att ni skulle bli f\u00f6rst\u00e5dda f\u00f6r n\u00e5gra \u00e5r sedan p\u00e5 Stack Overflow.<\/p>\n<p>Om det fanns ett pris f\u00f6r den s\u00e4msta namngivningen av programvaruprodukter, skulle detta fall definitivt vara en av pristagarna. Hamming-avst\u00e5ndet mellan dessa namn \u00e4r s\u00e5 litet att det f\u00f6rvirrar \u00e4ven erfarna ingenj\u00f6rer vars fingrar skriver ett namn medan huvudet t\u00e4nker p\u00e5 ett annat. Det h\u00e4r \u00e4r misslyckade planer som skapades med de b\u00e4sta avsikter; de har uppfyllt profetian om att databasen skulle vara i brand. Och jag sk\u00e4mtar inte. Personen som kom p\u00e5 ett s\u00e5dant namngivningssystem har orsakat blod, svett och t\u00e5rar.<\/p>\n<p><img decoding=\"async\" alt=\"Denna databas brinner...\" src=\"\/wp-content\/uploads\/2020\/10\/b793ce183c5d0477c32c87f64bce5879.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>Pyrrhusseger<\/h2>\n<p>\nMan skulle kunna tro att Firestore \u00e4r en <i>ers\u00e4ttning<\/i> f\u00f6r Firebase, dess efterf\u00f6ljare i n\u00e4sta generation, men det skulle vara en missuppfattning. Firestore passar garanterat inte som en ers\u00e4ttning f\u00f6r Firebase. Det verkar som om n\u00e5gon har skurit bort allt intressant fr\u00e5n det och f\u00f6rvirrat stor del av det kvarvarande p\u00e5 olika s\u00e4tt.<\/p>\n<p>Dock kan en snabb blick p\u00e5 de tv\u00e5 produkterna lura dig: det verkar som om de g\u00f6r ungef\u00e4r samma sak, genom f\u00f6r det mesta liknande API och till och med i samma databas-session. Skillnaderna \u00e4r sv\u00e5ra att uppt\u00e4cka och m\u00e4rks f\u00f6rst vid noggrant j\u00e4mf\u00f6rande studier av omfattande dokumentation. Eller n\u00e4r man f\u00f6rs\u00f6ker portera perfekt fungerande Firebase-kod s\u00e5 att den fungerar med Firestore. Redan d\u00e5 uppt\u00e4cker du att databasgr\u00e4nssnittet gl\u00f6der s\u00e5 snart du f\u00f6rs\u00f6ker utf\u00f6ra drag-and-drop i realtid. Jag upprepar, jag sk\u00e4mtar inte.<\/p>\n<p>Firebase-klienten \u00e4r artig i den bem\u00e4rkelsen att den buffrar \u00e4ndringar och g\u00f6r automatiska omf\u00f6rs\u00f6k f\u00f6r uppdateringar, d\u00e4r den senaste skrivoperationen prioriteras. Men Firestore har en begr\u00e4nsning p\u00e5 1 skrivoperation per dokument per anv\u00e4ndare per sekund, och denna begr\u00e4nsning till\u00e4mpas av servern. N\u00e4r du arbetar med den m\u00e5ste du sj\u00e4lv hitta s\u00e4tt att kringg\u00e5 den och implementera en skopbegr\u00e4nsare f\u00f6r uppdateringar, \u00e4ven n\u00e4r du bara f\u00f6rs\u00f6ker skapa din applikation. Det vill s\u00e4ga Firestore \u00e4r en databas f\u00f6r realtid utan en klient f\u00f6r realtid, som maskerar sig sj\u00e4lv som en med hj\u00e4lp av API.<\/p>\n<p>H\u00e4r b\u00f6rjar vi se de f\u00f6rsta tecknen p\u00e5 syftet med Firestore. Kanske har jag fel, men jag misst\u00e4nker att n\u00e5gon h\u00f6gt upp i Googles ledning s\u00e5g p\u00e5 Firebase efter k\u00f6pet och bara sa: \"Nej, herregud, nej. Det h\u00e4r \u00e4r oacceptabelt. Inte under min ledning.\"<\/p>\n<p><img decoding=\"async\" alt=\"Denna databas brinner...\" src=\"\/wp-content\/uploads\/2020\/10\/fbb5ce5ff93b4e3a7bdcd12cce3bdd92.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nHan kom ut fr\u00e5n sina rum och utropade:<\/p>\n<p><i>\u201eEn stor JSON-dokument? Nej. Du kommer att dela upp data i separata dokument, var och en med en storlek p\u00e5 h\u00f6gst 1 megabyte.\u201d<\/i><\/p>\n<p>Det verkar som en s\u00e5dan begr\u00e4nsning inte kommer att \u00f6verleva det f\u00f6rsta m\u00f6tet med en tillr\u00e4ckligt motiverad anv\u00e4ndarbas. Du vet att det \u00e4r sant. P\u00e5 v\u00e5rt arbete, till exempel, har vi drygt ett och ett halvt tusen presentationer, och det \u00e4r Helt Normalt.<\/p>\n<p>Med en s\u00e5dan begr\u00e4nsning kommer du att beh\u00f6va acceptera faktum att ett \"dokument\" i databasen inte kommer att likna n\u00e5got objekt som en anv\u00e4ndare skulle kalla ett dokument.<\/p>\n<p><i>\u201eArray av arrayer som kan rekursivt inneh\u00e5lla andra element? Nej. Arrayer kommer endast att inneh\u00e5lla objekt eller fasta l\u00e4ngdnummer, precis som Herren avs\u00e5g.\u201d<\/i><\/p>\n<p>S\u00e5 om du hoppades att kunna placera GeoJSON i din Firestore, kommer du att uppt\u00e4cka att det \u00e4r om\u00f6jligt. Inga icke-en-dimensionella element \u00e4r till\u00e5tna. Jag hoppas att du gillar Base64 och\/eller JSON inuti JSON.<\/p>\n<p><i>\u201eImport och export av JSON via HTTP, kommandoradsverktyg eller adminpanel? Nej. Du kan endast exportera och importera data i Google Cloud Storage. S\u00e5 verkar det nu heta. Och n\u00e4r jag s\u00e4ger \"du\", riktar jag mig endast till dem som har befogenheter som Projekt\u00e4gare. Alla andra kan g\u00e5 och skapa biljetter.\u201d<\/i><\/p>\n<p>Som ni ser, \u00e4r FireBases datamodell l\u00e4tt att beskriva. Den inneh\u00e5ller ett enormt JSON-dokument som kopplar JSON-nycklar till URL-v\u00e4gar. Om du skriver med <code>HTTP PUT<\/code> p\u00e5 <code>\/<\/code> FireBase f\u00f6ljande:<\/p>\n<pre><code class=\"json\">{\n  \"hello\": \"v\u00e4rlden\"\n}<\/code><\/pre>\n<p>\nD\u00e5 <code>GET \/hello<\/code> kommer att returnera <code>\"v\u00e4rlden\"<\/code>. I huvudsak fungerar det precis som du f\u00f6rv\u00e4ntar dig. Samlingen av FireBase-objekt <code>\/my-collection\/:id<\/code> \u00e4r likv\u00e4rdig med en JSON-dictionary <code>{\"my-collection\": {...}}<\/code> i roten, vars inneh\u00e5ll \u00e4r tillg\u00e4ngligt i <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>\nDet fungerar utm\u00e4rkt om varje ins\u00e4ttning har ID utan kollisioner, f\u00f6r vilket det finns en standardl\u00f6sning i systemet.<\/p>\n<p>Med andra ord \u00e4r databasen 100 % kompatibel med JSON (*) och fungerar utm\u00e4rkt med HTTP, som exempelvis CouchDB. Men fr\u00e4mst anv\u00e4nder du den via ett realtids-API som abstraherar websockets, autentisering och prenumerationer. Administrationspanelen har b\u00e5da funktionerna, vilket g\u00f6r det m\u00f6jligt att b\u00e5de redigera i realtid och importera\/exportera JSON. Om du f\u00f6ljer samma m\u00f6nster i din kod kommer du att bli f\u00f6rv\u00e5nad \u00f6ver hur mycket specialiserad kod som f\u00f6rsvinner n\u00e4r du inser att patch och diff JSON l\u00f6ser 90 % av de rutinm\u00e4ssiga uppgifterna f\u00f6r att hantera det permanenta tillst\u00e5ndet.<\/p>\n<p>Firestore datamodell liknar JSON, men skiljer sig fr\u00e5n det p\u00e5 n\u00e5gra kritiskt viktiga punkter. Jag har redan n\u00e4mnt avsaknaden av arrayer inom arrayer. Sub-kollektioner \u00e4r koncept av f\u00f6rsta klass, separata fr\u00e5n sitt inneh\u00e5llande JSON-dokument. Eftersom det inte finns n\u00e5gon f\u00e4rdig serialisering f\u00f6r detta, kr\u00e4vs en specialiserad kodk\u00f6rningsv\u00e4g f\u00f6r att h\u00e4mta och skriva data. F\u00f6r att hantera egna kollektioner m\u00e5ste du skriva egna skript och verktyg. Administrationspanelen till\u00e5ter dig att g\u00f6ra sm\u00e5 \u00e4ndringar ett f\u00e4lt i taget och har inga import\/export-funktioner.<\/p>\n<p>De tog en realtids NoSQL-databas och gjorde den till en l\u00e5ngsam icke-SQL med auto-sammanslagning och en separat kolumn som inte \u00e4r JSON. <i>N\u00e5got i stil med GraftQL<\/i>.<\/p>\n<p><img decoding=\"async\" alt=\"Denna databas brinner...\" src=\"\/wp-content\/uploads\/2020\/10\/c6e842418996c96f1efa873774f35f44.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>Het Java<\/h2>\n<p>\nOm Firestore skulle bli mer p\u00e5litligt och skalbart, \u00e4r ironin att den genomsnittliga utvecklaren f\u00e5r en mindre p\u00e5litlig l\u00f6sning \u00e4n om man v\u00e4ljde Firebase \"ur l\u00e5dan\". Den programvara som den Grinande Databasadministrat\u00f6ren beh\u00f6ver kr\u00e4ver en s\u00e5dan niv\u00e5 av insats och kompetens att det helt enkelt \u00e4r orealistiskt f\u00f6r en nisch d\u00e4r man f\u00f6rv\u00e4ntar sig en bra produkt. Det \u00e4r som att HTML5 Canvas inte p\u00e5 n\u00e5got s\u00e4tt kan ers\u00e4tta Flash utan utvecklingsverktyg och spelare. Dessutom har Firestore drabbats av en besatthet av datarenslighet och steril validering som helt enkelt inte matchar hur en genomsnittlig aff\u00e4rsanv\u00e4ndare <i>f\u00f6redrar att arbeta<\/i>: f\u00f6r honom \u00e4r ingenting n\u00f6dv\u00e4ndigt, eftersom allt till slut \u00e4r ett utkast.<\/p>\n<p>Den st\u00f6rsta nackdelen med FireBase \u00e4r att klienten skapades flera \u00e5r tidigare \u00e4n planerat, l\u00e5ngt innan de flesta webbutvecklare k\u00e4nde till immutabilitet. D\u00e4rf\u00f6r f\u00f6ruts\u00e4tter FireBase att du kommer att f\u00f6r\u00e4ndra data, och utnyttjar inte f\u00f6rdelarna med anv\u00e4ndarens immutabilitet. Dessutom \u00e5teranv\u00e4nder den inte data i de snapshots som skickas till anv\u00e4ndaren, vilket g\u00f6r det mycket sv\u00e5rare att utf\u00f6ra diff. F\u00f6r stora dokument \u00e4r dess transaktionsmekanism baserad p\u00e5 f\u00f6r\u00e4nderliga diff helt enkelt otillr\u00e4cklig. Vi har ju redan <code>WeakMap<\/code> i JavaScript. Det \u00e4r bekv\u00e4mt.<\/p>\n<p>Om man ger data r\u00e4tt form och inte g\u00f6r tr\u00e4den f\u00f6r omfattande, kan man kringg\u00e5 detta problem. Men jag undrar om FireBase skulle bli mycket mer intressant om utvecklarna sl\u00e4ppte en verkligt bra klient-API som anv\u00e4nde immutabilitet i kombination med seri\u00f6s praktisk v\u00e4gledning om databasstruktur. Ist\u00e4llet verkar de ha f\u00f6rs\u00f6kt fixa n\u00e5got som inte \u00e4r trasigt, och det har blivit s\u00e4mre.<\/p>\n<p>Jag k\u00e4nner inte till all logik som l\u00e5g bakom skapandet av Firestore. Funderingar om motivationer som uppst\u00e5r inom en svart l\u00e5da \u00e4r ocks\u00e5 en del av underh\u00e5llningen. S\u00e5dan kontrast mellan tv\u00e5 extremt liknande men of\u00f6r j\u00e4mf\u00f6rbara databaser \u00e4r ganska s\u00e4llsynt. Som om n\u00e5gon t\u00e4nkte: <i>\u00abFirebase \u00e4r bara en funktion som vi kan emulera i Google Cloud\u00bb<\/i>, men samtidigt inte har f\u00f6rst\u00e5tt konceptet att definiera verkliga krav eller skapa anv\u00e4ndbara l\u00f6sningar som uppfyller alla dessa krav. <i>\u00abL\u00e5t utvecklarna t\u00e4nka p\u00e5 det. G\u00f6r bara UI:t snyggt... Kan vi l\u00e4gga till mer eld?\u00bb<\/i><\/p>\n<p>Jag f\u00f6rst\u00e5r n\u00e5gra saker om datastrukturer. Jag ser tydligt att konceptet \"allt i ett stort JSON-tr\u00e4d\" \u00e4r ett f\u00f6rs\u00f6k att avskilja databasen fr\u00e5n en k\u00e4nsla av stor skala. Att f\u00f6rv\u00e4nta sig att mjukvaran bara klarar av en tveksam fraktal av datastrukturen \u00e4r ren galenskap. Jag beh\u00f6ver inte ens f\u00f6rest\u00e4lla mig hur illa allt kan bli, jag har gjort strikta kodgranskningar och <i>sett saker som ni m\u00e4nniskor inte ens kan dr\u00f6mma om<\/i>. Men jag vet ocks\u00e5 hur bra strukturer ser ut, <noindex><a rel=\"nofollow\" href=\"https:\/\/acko.net\/blog\/apis-are-about-policy\">hur man anv\u00e4nder dem<\/a><\/noindex> och <noindex><a rel=\"nofollow\" href=\"https:\/\/acko.net\/blog\/software-development-as-advanced-damage-control\/\">och varf\u00f6r man b\u00f6r g\u00f6ra det.<\/a><\/noindex>Jag kan f\u00f6rest\u00e4lla mig en v\u00e4rld d\u00e4r Firestore skulle verka fullt logisk, och de som skapade den skulle tro att de hade gjort ett gott arbete. Men vi lever inte i denna v\u00e4rld.<\/p>\n<p>St\u00f6det f\u00f6r att bygga fr\u00e5gor i FireBase \u00e4r d\u00e5ligt enligt vilken standard som helst, det finns n\u00e4stan inget. Det kr\u00e4ver definitivt f\u00f6rb\u00e4ttring eller \u00e5tminstone en \u00f6versyn. Men Firestore \u00e4r inte mycket b\u00e4ttre, eftersom den \u00e4r begr\u00e4nsad till de samma endimensionella index som finns i enkel SQL. Om du beh\u00f6ver fr\u00e5gor som m\u00e4nniskor utf\u00f6r med kaotiska data, s\u00e5 beh\u00f6vs fulltexts\u00f6kning, filter p\u00e5 flera intervall och en godtycklig anv\u00e4ndardefinierad ordning. Vid noggrann granskning \u00e4r funktionerna i enkel SQL sj\u00e4lva f\u00f6r begr\u00e4nsade. Dessutom \u00e4r de enda SQL-fr\u00e5gor som m\u00e4nniskor kan utf\u00f6ra i produktion snabba fr\u00e5gor. Du kommer att beh\u00f6va en specialanpassad l\u00f6sning f\u00f6r indexing med genomt\u00e4nkta datastrukturer. F\u00f6r allt annat b\u00f6r det \u00e5tminstone finnas en inkrementell map-reduce eller n\u00e5got liknande.<\/p>\n<p>Om du s\u00f6ker information om detta i Googles dokumentation, hoppas jag att du blir h\u00e4nvisad till n\u00e5got som BigTable och BigQuery. Men alla dessa l\u00f6sningar \u00e5tf\u00f6ljs av en m\u00e4ngd tjock f\u00f6retagsjargong, s\u00e5 du kommer snabbt att \u00e5terv\u00e4nda och b\u00f6rja s\u00f6ka efter n\u00e5got annat.<\/p>\n<p>Det sista du beh\u00f6ver i en realtidsdatabas \u00e4r n\u00e5got som skapats av m\u00e4nniskor och f\u00f6r m\u00e4nniskor som arbetar enligt l\u00f6neskala f\u00f6r ledningen.<\/p>\n<p><i>(*) Det \u00e4r ett sk\u00e4mt, det finns inget begrepp som <noindex><a rel=\"nofollow\" href=\"http:\/\/seriot.ch\/parsing_json.php\">100% JSON-kompatibilitet<\/a><\/noindex>.<\/i><\/p>\n<p><\/p>\n<h4>I reklamens namn<\/h4>\n<p>\nLetar du efter <noindex><a rel=\"nofollow\" href=\"https:\/\/vdsina.ru\/cloud-servers?partner=habr130\">\u00e4r en virtuell dedikerad server.<\/a><\/noindex> en server f\u00f6r utveckling och hosting av projekt? D\u00e5 \u00e4r du precis v\u00e5r kund \ud83d\ude42 Dygnspriss\u00e4ttning f\u00f6r servrar av olika konfigurationer, antiDDoS och Windows-licenser ing\u00e5r redan i priset.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/vdsina.ru\/cloud-servers?partner=habr130\"><img decoding=\"async\" alt=\"Denna databas brinner...\" src=\"\/wp-content\/uploads\/2020\/10\/f1215924e9c1c41d00f7c71c6c569aa4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><br \/>\n<br \/>K\u00e4lla: <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.4 - 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\/sv\/blog\/administrirovanie\/eta-baza-dannyh-v-ogne\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sv_SE\" \/>\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\/sv\/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\udd47Den h\u00e4r databasen \u00e4r i brand\u2026 | ProHoster","description":"L\u00e5t mig ber\u00e4tta en teknisk historia. M\u00e5nga \u00e5r.","canonical_url":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/eta-baza-dannyh-v-ogne","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sv_SE","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\/sv\/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\/sv\/wp-json\/wp\/v2\/posts\/96465","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=96465"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/96465\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media\/96466"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=96465"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=96465"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=96465"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}