{"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\/pt\/blog\/administrirovanie\/eta-baza-dannyh-v-ogne","title":{"rendered":"Este banco de dados est\u00e1 em chamas\u2026","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Este banco de dados est\u00e1 em chamas\u2026\" src=\"\/wp-content\/uploads\/2020\/10\/e4e39a7039dad14422fd83c05f114d6f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDeixe-me contar uma hist\u00f3ria t\u00e9cnica.<\/p>\n<p>H\u00e1 muitos anos, desenvolvi um aplicativo com fun\u00e7\u00f5es de colabora\u00e7\u00e3o integradas. Era uma pilha experimental conveniente que utilizava todo o potencial do in\u00edcio do React e do CouchDB. Ele sincronizava dados em tempo real via JSON. <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Operational_transformation\">OT<\/a><\/noindex>. Era utilizado no trabalho interno da empresa, mas sua ampla aplicabilidade e potencial em outros setores eram evidentes.<\/p>\n<p>Ao tentar vender essa tecnologia para clientes potenciais, nos deparamos com um obst\u00e1culo inesperado. No v\u00eddeo de demonstra\u00e7\u00e3o, nossa tecnologia parecia e funcionava perfeitamente, sem problemas. O v\u00eddeo mostrava exatamente como funcionava, sem simula\u00e7\u00f5es. Criamos e codificamos um cen\u00e1rio de uso realista do programa.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\n<img decoding=\"async\" alt=\"Este banco de dados est\u00e1 em chamas\u2026\" src=\"\/wp-content\/uploads\/2020\/10\/ea517a6aee0b015dc4d7bad4e86af6f4.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNa verdade, isso acabou sendo um problema. Nossa demonstra\u00e7\u00e3o funcionava exatamente como as aplica\u00e7\u00f5es de outras pessoas faziam. Para ser espec\u00edfico, a informa\u00e7\u00e3o era transmitida instantaneamente de A para B, mesmo que fossem grandes arquivos de m\u00eddia. Ap\u00f3s o login, cada usu\u00e1rio via novas postagens. Com o aplicativo, diferentes usu\u00e1rios podiam colaborar claramente nos mesmos projetos, mesmo em caso de conex\u00e3o de Internet inst\u00e1vel em algum lugar na ro\u00e7a. Isso \u00e9, de forma impl\u00edcita, sugerido em qualquer v\u00eddeo sobre o produto editado no After Effects.<\/p>\n<p>Apesar de todos saberem para que serve o bot\u00e3o Atualizar, ningu\u00e9m entendia que os aplicativos web que eles nos pedem para criar, geralmente, est\u00e3o sujeitos \u00e0s suas limita\u00e7\u00f5es. E que, se n\u00e3o forem mais necess\u00e1rios, a experi\u00eancia do usu\u00e1rio ser\u00e1 completamente diferente. Principalmente, eles percebiam que podiam \"conversar\", deixando anota\u00e7\u00f5es para seus interlocutores, e se perguntavam como isso era diferente, por exemplo, do Slack. Ufa!<\/p>\n<h2>Design de sincroniza\u00e7\u00f5es cotidianas<\/h2>\n<p>\nSe voc\u00ea j\u00e1 tem experi\u00eancia em desenvolvimento de software, deve se irritar com a necessidade de lembrar que a maioria das pessoas n\u00e3o consegue simplesmente olhar para uma imagem da interface e entender o que ela far\u00e1 ao interagir com ela. Sem mencionar o que acontece dentro do pr\u00f3prio programa. Saber o que <i>pode<\/i> vai acontecer \u00e9, em grande parte, o resultado de saber o que n\u00e3o pode acontecer e o que n\u00e3o deve acontecer. Para isso, \u00e9 necess\u00e1rio <noindex><a rel=\"nofollow\" href=\"https:\/\/uxdesign.cc\/design-of-everyday-things-chapter-01-summary-and-keypoints-664d426a11e0\">modelo mental<\/a><\/noindex> n\u00e3o apenas o que o software faz, mas tamb\u00e9m como suas partes individuais est\u00e3o alinhadas e se comunicam entre si.<\/p>\n<p>Um cl\u00e1ssico exemplo disso \u00e9 um usu\u00e1rio que, por vinte minutos, olha para <i>spinner.gif<\/i>, se perguntando quando finalmente o trabalho vai acabar. O desenvolvedor entenderia que o processo provavelmente travou e que o gif nunca desaparecer\u00e1 da tela. Essa anima\u00e7\u00e3o imita o progresso do trabalho, mas n\u00e3o tem rela\u00e7\u00e3o com seu estado. Em casos como este, alguns t\u00e9cnicos costumam revirar os olhos, impressionando-se com o grau de mal-entendido dos usu\u00e1rios. Mas note quem de fato aponta para os rel\u00f3gios girat\u00f3rios e diz que, na verdade, eles est\u00e3o completamente parados?<\/p>\n<p><img decoding=\"async\" alt=\"Este banco de dados est\u00e1 em chamas\u2026\" src=\"\/wp-content\/uploads\/2020\/10\/db67c48846549b272a367c0a37aec97b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nEsta \u00e9 a ess\u00eancia do valor em tempo real. Hoje em dia, bancos de dados em tempo real ainda s\u00e3o extremamente pouco utilizados, e muitos os encaram com desconfian\u00e7a. A maioria desses bancos de dados tende a inclinar-se ao estilo NoSQL, o que geralmente leva ao uso de solu\u00e7\u00f5es baseadas em Mongo, das quais \u00e9 melhor esquecer. No entanto, para mim, isso significa trabalhar confortavelmente com CouchDB, al\u00e9m de explorar o design de estruturas que poder\u00e3o ser preenchidas com dados por qualquer burocrata. Acredito que estou utilizando meu tempo de forma mais eficiente.<\/p>\n<p>Mas o verdadeiro tema deste post \u00e9 o que estou usando atualmente. N\u00e3o por minha escolha, mas devido a uma pol\u00edtica corporativa aplicada de forma indiferente e cega. Portanto, farei uma compara\u00e7\u00e3o Absolutamente Justa e Imparcial de dois produtos intimamente relacionados ao trabalho com bancos de dados em tempo real do Google.<\/p>\n<p><img decoding=\"async\" alt=\"Este banco de dados est\u00e1 em chamas\u2026\" src=\"\/wp-content\/uploads\/2020\/10\/89432de9501b7667f8e187d14afc8897.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAmbos os nomes cont\u00eam a palavra Fire. Um eu lembro com carinho. O outro, para mim, \u00e9 um tipo diferente de chama. N\u00e3o estou apressado para dizer seus nomes, porque assim que o fizer, enfrentaremos o primeiro grande problema \u2014 os nomes.<\/p>\n<p>O primeiro se chama <i>Firebase Real-Time Database<\/i>, e o segundo \u2014 <i>Firebase Cloud Firestore<\/i>. Ambos s\u00e3o produtos da <i>Firebase suite<\/i> do Google. Suas APIs s\u00e3o chamadas, respectivamente, <code>firebase.database(\u2026)<\/code> e <code>firebase.firestore(\u2026)<\/code>.<\/p>\n<p>Isso ocorreu porque <i>Real-Time Database<\/i> \u2014 \u00e9 apenas a vers\u00e3o original do <i>Firebase<\/i> antes de sua aquisi\u00e7\u00e3o pelo Google em 2014. Depois, o Google decidiu criar um produto paralelo, constru\u00eddo a partir dos dados em grande escala da empresa, e o chamou de Firestore com uma nuvem. Espero que voc\u00ea ainda n\u00e3o esteja confuso. Se voc\u00ea se confundiu, n\u00e3o se preocupe, eu mesmo reescrevi esta parte do artigo dez vezes. <i>Porque \u00e9 necess\u00e1rio indicar<\/i> Firebase, a plataforma de big data da empresa, e foi chamada de Firestore com nuvem. Espero que voc\u00ea ainda n\u00e3o esteja confuso. Se ainda estiver confuso, n\u00e3o se preocupe, eu mesmo reescrevi esta parte do artigo dez vezes.<\/p>\n<p>Porque \u00e9 necess\u00e1rio especificar <i>Firebase<\/i> na quest\u00e3o do Firebase, e <i>Firestore<\/i> na quest\u00e3o do Firebase, pelo menos para que voc\u00ea fosse entendido alguns anos atr\u00e1s no Stack Overflow.<\/p>\n<p>Se houvesse um pr\u00eamio para o pior nome de produtos de software, este caso definitivamente se tornaria um dos candidatos. A dist\u00e2ncia de Hamming entre esses nomes \u00e9 t\u00e3o pequena que confunde at\u00e9 mesmo engenheiros experientes, cujos dedos digitam um nome enquanto a cabe\u00e7a pensa em outro. Esses planos falharam estrondosamente, criados com as melhores inten\u00e7\u00f5es; eles cumpriram a profecia de que o banco de dados estaria em chamas. E n\u00e3o estou brincando. A pessoa que inventou esse esquema de nomenclatura causou sangue, suor e l\u00e1grimas.<\/p>\n<p><img decoding=\"async\" alt=\"Este banco de dados est\u00e1 em chamas\u2026\" src=\"\/wp-content\/uploads\/2020\/10\/b793ce183c5d0477c32c87f64bce5879.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>Vit\u00f3ria de Pirro<\/h2>\n<p>\nPoderia-se pensar que Firestore \u00e9 uma <i>substitui\u00e7\u00e3o<\/i> do Firebase, seu descendente de pr\u00f3xima gera\u00e7\u00e3o, mas isso seria um equ\u00edvoco. O Firestore definitivamente n\u00e3o serve como substituto do Firebase. Parece que algu\u00e9m removeu tudo o que \u00e9 interessante dele, e confundiu a maior parte do que sobrou de v\u00e1rias maneiras.<\/p>\n<p>No entanto, uma r\u00e1pida olhada nos dois produtos pode confundi-lo: eles parecem fazer praticamente a mesma coisa, atrav\u00e9s de APIs que s\u00e3o majoritariamente id\u00eanticas e at\u00e9 mesmo na mesma sess\u00e3o de banco de dados. As diferen\u00e7as s\u00e3o sutis e s\u00f3 s\u00e3o descobertas atrav\u00e9s de um exame comparativo cuidadoso da extensa documenta\u00e7\u00e3o. Ou quando voc\u00ea tenta portar um c\u00f3digo que funciona perfeitamente no Firebase para que ele funcione com o Firestore. \u00c9 nesse momento que voc\u00ea percebe que a interface do banco de dados pega fogo assim que voc\u00ea tenta realizar um arrasto em tempo real. Reitero, n\u00e3o estou brincando.<\/p>\n<p>O cliente Firebase \u00e9 educado na medida em que ele armazena em cache as mudan\u00e7as e realiza tentativas autom\u00e1ticas de atualiza\u00e7\u00e3o, priorizando a \u00faltima opera\u00e7\u00e3o de grava\u00e7\u00e3o. No entanto, o Firestore possui uma limita\u00e7\u00e3o de 1 opera\u00e7\u00e3o de grava\u00e7\u00e3o por documento por usu\u00e1rio por segundo, e essa limita\u00e7\u00e3o \u00e9 imposta pelo servidor. Ao trabalhar com ele, voc\u00ea deve encontrar uma forma de contornar isso e implementar um limitador de taxa de atualiza\u00e7\u00e3o, mesmo quando est\u00e1 apenas tentando criar seu aplicativo. Ou seja, o Firestore \u00e9 um banco de dados em tempo real sem um cliente em tempo real, que se disfar\u00e7a como tal atrav\u00e9s da API.<\/p>\n<p>\u00c9 aqui que come\u00e7amos a ver os primeiros sinais do sentido da exist\u00eancia do Firestore. Pode ser que eu esteja enganado, mas suspeito que algu\u00e9m no alto comando do Google olhou para o Firebase ap\u00f3s a compra e simplesmente disse: \u201cN\u00e3o, de jeito nenhum. Isso \u00e9 inaceit\u00e1vel. N\u00e3o sob minha lideran\u00e7a\u201d.<\/p>\n<p><img decoding=\"async\" alt=\"Este banco de dados est\u00e1 em chamas\u2026\" src=\"\/wp-content\/uploads\/2020\/10\/fbb5ce5ff93b4e3a7bdcd12cce3bdd92.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nEle saiu de seus aposentos e proclamou:<\/p>\n<p><i>\u201cUm grande documento JSON? N\u00e3o. Voc\u00ea vai dividir os dados em documentos separados, cada um com um tamanho m\u00e1ximo de 1 megabyte.\u201d<\/i><\/p>\n<p>Parece que essa limita\u00e7\u00e3o n\u00e3o vai suportar o primeiro choque com qualquer base de usu\u00e1rios suficientemente motivada. Voc\u00ea sabe que \u00e9 verdade. No nosso trabalho, por exemplo, temos mais de mil apresenta\u00e7\u00f5es, e isso \u00e9 absolutamente normal.<\/p>\n<p>Com essa limita\u00e7\u00e3o, voc\u00ea ter\u00e1 que aceitar o fato de que um \u2018documento\u2019 no banco de dados n\u00e3o se parecer\u00e1 com nenhum objeto que o usu\u00e1rio possa chamar de documento.<\/p>\n<p><i>\u201cArrays de arrays, que podem conter recursivamente outros elementos? N\u00e3o. Arrays v\u00e3o conter apenas objetos ou n\u00fameros de comprimento fixo, como foi destinado pelo Senhor.\u201d<\/i><\/p>\n<p>Portanto, se voc\u00ea esperava colocar seu GeoJSON no Firestore, descobrir\u00e1 que isso \u00e9 imposs\u00edvel. Nada multidimensional \u00e9 permitido. Espero que voc\u00ea goste de Base64 e\/ou JSON dentro do JSON.<\/p>\n<p><i>\u201cImporta\u00e7\u00e3o e exporta\u00e7\u00e3o de JSON via HTTP, ferramentas de linha de comando ou painel de administrador? N\u00e3o. Voc\u00ea s\u00f3 poder\u00e1 exportar e importar dados no Google Cloud Storage. Parece que agora \u00e9 assim que se chama. E quando digo \u2018voc\u00ea\u2019, estou me dirigindo apenas \u00e0queles que t\u00eam autoridade de Propriet\u00e1rio do Projeto. Todos os outros podem ir e criar tickets.\u201d<\/i><\/p>\n<p>Como voc\u00ea pode ver, o modelo de dados do FireBase \u00e9 f\u00e1cil de descrever. Ele cont\u00e9m um enorme documento JSON que vincula chaves JSON a caminhos de URL. Se voc\u00ea escrever usando <code>HTTP PUT<\/code> em <code>\/<\/code> FireBase o seguinte:<\/p>\n<pre><code class=\"json\">{\n  \"hello\": \"mundo\"\n}<\/code><\/pre>\n<p>\nEnt\u00e3o <code>GET \/hello<\/code> retornar\u00e1 <code>\"mundo\"<\/code>. Basicamente, funciona exatamente como voc\u00ea espera. A cole\u00e7\u00e3o de objetos FireBase <code>\/my-collection\/:id<\/code> \u00e9 equivalente a um dicion\u00e1rio JSON <code>{\"my-collection\": {...}}<\/code> na raiz, cujo conte\u00fado est\u00e1 dispon\u00edvel em <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>\nIsso funciona perfeitamente se cada inser\u00e7\u00e3o tiver IDs sem colis\u00f5es, para o qual o sistema possui uma solu\u00e7\u00e3o padr\u00e3o.<\/p>\n<p>Em outras palavras, o banco de dados \u00e9 100% compat\u00edvel com JSON (*) e funciona perfeitamente com HTTP, como o CouchDB. Mas, em sua maioria, voc\u00ea a utiliza atrav\u00e9s de uma API em tempo real, que abstrai websockets, autentica\u00e7\u00e3o e assinaturas. O painel de administra\u00e7\u00e3o possui ambas as funcionalidades, permitindo tanto a edi\u00e7\u00e3o em tempo real quanto a importa\u00e7\u00e3o\/exporta\u00e7\u00e3o de JSON. Se voc\u00ea seguir isso em seu c\u00f3digo, ficar\u00e1 surpreso com a quantidade de c\u00f3digo especializado que desaparecer\u00e1 quando entender que patch e diff JSON resolvem 90% das tarefas rotineiras de manipula\u00e7\u00e3o de estado persistente.<\/p>\n<p>O modelo de dados Firestore \u00e9 semelhante ao JSON, mas difere dele em alguns aspectos cr\u00edticos. J\u00e1 mencionei a aus\u00eancia de arrays dentro de arrays. O modelo de sub-cole\u00e7\u00f5es \u00e9 que elas s\u00e3o conceitos de primeira classe, separados do documento JSON que as cont\u00e9m. Como n\u00e3o existe uma serializa\u00e7\u00e3o pronta para isso, \u00e9 necess\u00e1rio um caminho especializado para execu\u00e7\u00e3o de c\u00f3digo ao obter e gravar dados. Para manipular suas pr\u00f3prias cole\u00e7\u00f5es, \u00e9 preciso escrever seus pr\u00f3prios scripts e ferramentas. O painel de administra\u00e7\u00e3o permite que voc\u00ea fa\u00e7a apenas pequenas altera\u00e7\u00f5es de um campo de cada vez e n\u00e3o possui recursos de importa\u00e7\u00e3o\/exporta\u00e7\u00e3o.<\/p>\n<p>Eles pegaram um banco de dados NoSQL em tempo real e o transformaram em um n\u00e3o-SQL lento com auto-combina\u00e7\u00e3o e uma coluna separada para n\u00e3o-JSON. <i>Algo no esp\u00edrito do GraftQL<\/i>.<\/p>\n<p><img decoding=\"async\" alt=\"Este banco de dados est\u00e1 em chamas\u2026\" src=\"\/wp-content\/uploads\/2020\/10\/c6e842418996c96f1efa873774f35f44.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>Java quente<\/h2>\n<p>\nSe o Firestore deveria se tornar mais confi\u00e1vel e escal\u00e1vel, a ironia \u00e9 que o desenvolvedor m\u00e9dio ter\u00e1 uma solu\u00e7\u00e3o menos confi\u00e1vel do que se tivesse escolhido o FireBase 'pronto para uso'. O software necess\u00e1rio para o Administrador de Banco de Dados Cr\u00edtico requer tal n\u00edvel de esfor\u00e7o e o calibre de especialistas que simplesmente n\u00e3o \u00e9 realista para o nicho onde supostamente deveria haver um bom produto. \u00c9 como se o HTML5 Canvas n\u00e3o fosse uma substituta do Flash se n\u00e3o houver ferramentas de desenvolvimento e reprodutores. Al\u00e9m disso, o Firestore se atolou na busca pela pureza dos dados e valida\u00e7\u00e3o est\u00e9ril, o que simplesmente n\u00e3o corresponde ao modo de trabalho do usu\u00e1rio m\u00e9dio de neg\u00f3cios. <i>gosta de trabalhar<\/i>: para ele, n\u00e3o \u00e9 necess\u00e1rio, porque at\u00e9 o final tudo \u00e9 um rascunho.<\/p>\n<p>A principal desvantagem do FireBase \u00e9 que o cliente foi criado alguns anos antes do seu prazo, muito antes de a maioria dos desenvolvedores web conhecer sobre imutabilidade. Por causa disso, o FireBase pressup\u00f5e que voc\u00ea ir\u00e1 modificar os dados e, portanto, n\u00e3o utiliza as vantagens da imutabilidade fornecida pelo usu\u00e1rio. Al\u00e9m disso, ele n\u00e3o reutiliza dados nos snapshots transmitidos ao usu\u00e1rio, o que torna a execu\u00e7\u00e3o de diffs muito mais dif\u00edcil. Para documentos grandes, o seu mecanismo de transa\u00e7\u00f5es baseado em diffs mut\u00e1veis simplesmente n\u00e3o \u00e9 adequado. Gente, n\u00f3s j\u00e1 temos <code>WeakMap<\/code> em JavaScript. Isso \u00e9 conveniente.<\/p>\n<p>Se os dados forem formatados corretamente e as \u00e1rvores n\u00e3o forem muito volumosas, \u00e9 poss\u00edvel contornar esse problema. Mas eu estou curioso se o FireBase seria muito mais interessante se os desenvolvedores lan\u00e7assem uma API de cliente realmente boa, que usasse imutabilidade em conjunto com conselhos pr\u00e1ticos s\u00e9rios sobre a estrutura das bases de dados. Em vez disso, eles parecem ter tentado consertar o que n\u00e3o estava quebrado, e isso tornou as coisas piores.<\/p>\n<p>Eu n\u00e3o sei toda a l\u00f3gica por tr\u00e1s da cria\u00e7\u00e3o do Firestore. Refletir sobre as motiva\u00e7\u00f5es que surgem dentro de uma caixa-preta \u00e9 tamb\u00e9m parte da divers\u00e3o. Essa oposi\u00e7\u00e3o entre duas bases de dados extremamente semelhantes, mas incompar\u00e1veis, \u00e9 bastante rara. \u00c9 como se algu\u00e9m tivesse pensado: <i>\u201cFirebase \u00e9 apenas uma fun\u00e7\u00e3o que podemos emular no Google Cloud\u201d<\/i>, mas ainda n\u00e3o descobriu o conceito de definir requisitos do mundo real ou criar solu\u00e7\u00f5es \u00fateis que atendam a todos esses requisitos. <i>\u201cDeixe isso para os desenvolvedores pensarem. Apenas fa\u00e7a a interface bonita... E podemos adicionar mais anima\u00e7\u00e3o?\u201d<\/i><\/p>\n<p>Eu entendo algumas coisas sobre estruturas de dados. Eu realmente vejo que a ideia de \u201ctudo em uma grande \u00e1rvore JSON\u201d \u00e9 uma tentativa de abstrair da base de dados qualquer sensa\u00e7\u00e3o de estrutura em larga escala. Esperar que o software simplesmente consiga lidar com qualquer fractal duvidoso de estrutura de dados \u00e9 simplesmente loucura. Eu n\u00e3o preciso nem imaginar qu\u00e3o ruim tudo pode ser, eu fiz auditorias rigorosas de c\u00f3digo e <i>vi coisas que voc\u00eas, pessoas, nem sonham.<\/i>. Mas eu tamb\u00e9m sei como s\u00e3o boas estruturas, <noindex><a rel=\"nofollow\" href=\"https:\/\/acko.net\/blog\/apis-are-about-policy\">como us\u00e1-las<\/a><\/noindex> e <noindex><a rel=\"nofollow\" href=\"https:\/\/acko.net\/blog\/software-development-as-advanced-damage-control\/\">e por que isso precisa ser feito.<\/a><\/noindex>Posso imaginar um mundo onde o Firestore pareceria bastante l\u00f3gico, e as pessoas que o criaram achariam que fizeram um bom trabalho. Mas n\u00e3o vivemos nesse mundo.<\/p>\n<p>O suporte para constru\u00e7\u00e3o de consultas no FireBase \u00e9 ruim por quaisquer padr\u00f5es; praticamente n\u00e3o existe. Definitivamente, ele precisa de melhorias ou, pelo menos, uma revis\u00e3o. Mas o Firestore n\u00e3o \u00e9 muito melhor, pois est\u00e1 limitado aos mesmos \u00edndices unidimensionais que existem em um SQL simples. Se voc\u00ea precisa de consultas que as pessoas fazem com dados ca\u00f3ticos, \u00e9 necess\u00e1rio ter busca de texto completo, filtros em v\u00e1rios intervalos e uma ordem arbitr\u00e1ria definida pelo usu\u00e1rio. Ao examinar cuidadosamente, as fun\u00e7\u00f5es do SQL simples s\u00e3o demasiado limitadas por si s\u00f3. Al\u00e9m disso, os \u00fanicos SQLs que as pessoas podem executar no ambiente de produ\u00e7\u00e3o s\u00e3o consultas r\u00e1pidas. Voc\u00ea precisar\u00e1 de uma solu\u00e7\u00e3o especializada para indexa\u00e7\u00e3o com estruturas de dados bem pensadas. Para tudo o que resta, pelo menos deveria haver uma forma incremental de map-reduce ou algo semelhante.<\/p>\n<p>Se voc\u00ea procurar informa\u00e7\u00f5es sobre isso na documenta\u00e7\u00e3o do Google, espero que o direcionem para algo como BigTable e BigQuery. No entanto, todas essas solu\u00e7\u00f5es v\u00eam acompanhadas de uma quantidade t\u00e3o grande de jarg\u00e3o corporativo que voc\u00ea rapidamente voltar\u00e1 e come\u00e7ar\u00e1 a buscar algo diferente.<\/p>\n<p>A \u00faltima coisa que voc\u00ea precisa em um banco de dados em tempo real \u00e9 algo criado por pessoas para pessoas, trabalhando de acordo com a escala salarial de ger\u00eancia.<\/p>\n<p><i>(*) Isso \u00e9 uma piada, n\u00e3o existe um conceito como <noindex><a rel=\"nofollow\" href=\"http:\/\/seriot.ch\/parsing_json.php\">compatibilidade com JSON 100%<\/a><\/noindex>.<\/i><\/p>\n<p><\/p>\n<h4>Em nome da publicidade<\/h4>\n<p>\nProcurando <noindex><a rel=\"nofollow\" href=\"https:\/\/vdsina.ru\/cloud-servers?partner=habr130\">VDS<\/a><\/noindex> um servidor para desenvolver e hospedar projetos? Voc\u00ea definitivamente \u00e9 o nosso cliente \ud83d\ude42 Cobran\u00e7a di\u00e1ria para servidores de v\u00e1rias configura\u00e7\u00f5es, antiDDoS e licen\u00e7as do Windows j\u00e1 est\u00e3o inclu\u00eddas no custo.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/vdsina.ru\/cloud-servers?partner=habr130\"><img decoding=\"async\" alt=\"Este banco de dados est\u00e1 em chamas\u2026\" src=\"\/wp-content\/uploads\/2020\/10\/f1215924e9c1c41d00f7c71c6c569aa4.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><br \/>\n<br \/>Fonte: <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\/pt\/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=\"pt_PT\" \/>\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\/pt\/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\udd47Este banco de dados est\u00e1 pegando fogo\u2026 | ProHoster","description":"Deixe-me contar uma hist\u00f3ria t\u00e9cnica. H\u00e1 muitos anos.","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/eta-baza-dannyh-v-ogne","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pt_PT","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\/pt\/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\/pt\/wp-json\/wp\/v2\/posts\/96465","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=96465"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/96465\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media\/96466"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=96465"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=96465"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=96465"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}