{"id":1535,"date":"2013-10-29T09:00:00","date_gmt":"2013-10-29T08:00:00","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=1535"},"modified":"2023-06-28T01:37:03","modified_gmt":"2023-06-28T08:37:03","slug":"couchbase-103-q-and-a","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/couchbase-103-q-and-a\/","title":{"rendered":"Couchbase 103: Perguntas e respostas"},"content":{"rendered":"<p>Em nossa s\u00e9rie de treinamentos cont\u00ednuos, v\u00e1rias perguntas surgem a cada vez, e eu as relaciono com suas respectivas respostas abaixo!<\/p>\n<p><span style=\"color: #007da4;font-size: 23px;font-weight: 600;line-height: 1.4\">Couchbase 103 - Modelagem de documentos<\/span><\/p>\n<p class=\"p3\"><strong>P: Supondo que voc\u00ea possa armazenar um documento como XML em vez de JSON, o que voc\u00ea acha de um em rela\u00e7\u00e3o ao outro para o Couchbase?<\/strong><\/p>\n<p class=\"p3\">R: Voc\u00ea pode armazenar XML, assim como podemos armazenar cadeias de caracteres. No entanto, \u00e9 dif\u00edcil fazer exibi\u00e7\u00f5es Map-Reduce para index\u00e1-las e consult\u00e1-las, pois n\u00e3o analisamos o XML no lado do servidor para poder usar a nota\u00e7\u00e3o de ponto como no JSON. O XML n\u00e3o \u00e9 nativo do javascript. A extens\u00e3o E4X para analisar XML n\u00e3o faz parte do mecanismo V8 que usamos no Couchbase para processar as fun\u00e7\u00f5es de mapa javascript.<\/p>\n<p class=\"p3\"><strong>P: Podemos fazer inser\u00e7\u00f5es\/atualiza\u00e7\u00f5es em massa no Couchbase?<\/strong><\/p>\n<p class=\"p3\">R: Normalmente, voc\u00ea faz isso da mesma forma que faz qualquer opera\u00e7\u00e3o CRUD com o Couchbase, usando os SDKs. Temos uma ferramenta de linha de comando que pode ler arquivos JSON do disco, cbtransfer. Recomendo o uso de uma VM r\u00e1pida (por exemplo, Java\/C\/C++\/Go em vez de Ruby) e a paraleliza\u00e7\u00e3o do trabalho se houver uma grande quantidade de documentos.<\/p>\n<p class=\"p1\"><strong>P: Voc\u00ea n\u00e3o est\u00e1 voltando ao padr\u00e3o \"relacional\" quando usa o padr\u00e3o de v\u00e1rios documentos?<\/strong><\/p>\n<p class=\"p1\">R: N\u00e3o necessariamente, \u00e9 mais uma separa\u00e7\u00e3o de preocupa\u00e7\u00f5es, mas ainda n\u00e3o h\u00e1 jun\u00e7\u00f5es. Trata-se apenas de isolar os comportamentos do usu\u00e1rio em documentos separados, n\u00e3o de normaliza\u00e7\u00e3o. H\u00e1 uma grande diferen\u00e7a entre os dois. Em vez de ter um documento para muitos comportamentos de usu\u00e1rio, voc\u00ea est\u00e1 isolando os documentos por chave para comportamentos de usu\u00e1rio espec\u00edficos e ainda armazenando dados desnormalizados. O que estamos conseguindo com o uso de JSON em vez de tabelas e de dados desnormalizados em vez de normalizados \u00e9 a capacidade de distribuir dados. Quando voc\u00ea tem tabelas normalizadas, a distribui\u00e7\u00e3o de dados e a computa\u00e7\u00e3o de jun\u00e7\u00f5es s\u00e3o muito desafiadoras. Voc\u00ea n\u00e3o pode dividir facilmente tabelas grandes em v\u00e1rios servidores e, quando o faz, a computa\u00e7\u00e3o de jun\u00e7\u00f5es exige a agrega\u00e7\u00e3o de tabelas grandes em v\u00e1rios servidores, o que ser\u00e1 pesado em termos de computa\u00e7\u00e3o e transfer\u00eancia de dados e n\u00e3o poder\u00e1 sustentar muitas consultas. \u00c9 claro que a l\u00f3gica das opera\u00e7\u00f5es CRUD em uma situa\u00e7\u00e3o de RDBMS distribu\u00eddo \u00e9 igualmente complexa.<\/p>\n<p class=\"p1\"><strong>P: Com base em sua experi\u00eancia, qual \u00e9 a melhor maneira de garantir, tanto quanto poss\u00edvel, que um item seja referido com o mesmo nome em todo o banco de dados?<\/strong><\/p>\n<p class=\"p1\">R: Em primeiro lugar, escolha caracter\u00edsticas imut\u00e1veis para as chaves, de modo que os IDs referenciais dentro do documento JSON n\u00e3o precisem ser atualizados. Se voc\u00ea precisar alterar uma chave que tenha sido referenciada em outros documentos, provavelmente ter\u00e1 de criar uma visualiza\u00e7\u00e3o para localizar e atualizar esses documentos ap\u00f3s a altera\u00e7\u00e3o da chave.<\/p>\n<p class=\"p1\"><strong>P: Voc\u00ea observou que uma das vantagens do CB \u00e9 a linha reta entre o aplicativo e os dados, pois eles s\u00e3o armazenados no banco de dados, ou seja, n\u00e3o h\u00e1 incompatibilidade de imped\u00e2ncia. W<span style=\"font-family: inherit;font-size: 1em;line-height: 1.4375em\">que se o aplicativo mudar e dados diferentes forem usados em p\u00e1ginas diferentes, ou (ainda pior) quando v\u00e1rios aplicativos estiverem analisando os mesmos dados. Ent\u00e3o, a abordagem RDBMS n\u00e3o \u00e9 melhor? ou voc\u00ea ainda a defenderia? Em caso afirmativo, por qu\u00ea?<\/span><\/strong><\/p>\n<p class=\"p1\"><span style=\"font-family: inherit;font-size: 1em;line-height: 1.4375em\">R: Se partes diferentes de um documento JSON forem usadas em p\u00e1ginas diferentes, isso n\u00e3o ser\u00e1 um problema. Se diferentes comportamentos de usu\u00e1rio modificarem o mesmo documento e houver uma oportunidade para condi\u00e7\u00f5es de corrida, voc\u00ea poder\u00e1 usar opera\u00e7\u00f5es CAS ou separar os documentos em v\u00e1rios. Se v\u00e1rios aplicativos estiverem analisando os mesmos dados, isso tamb\u00e9m n\u00e3o ser\u00e1 um problema. Se esses aplicativos forem de terceiros e puderem fazer grava\u00e7\u00f5es nos dados, \u00e9 melhor que eles passem por uma API para que a formata\u00e7\u00e3o das chaves JSON e outras valida\u00e7\u00f5es possam ser feitas para manter a formata\u00e7\u00e3o e a integridade dos dados. Nos sistemas RDBMS, voc\u00ea depende do banco de dados para fazer a valida\u00e7\u00e3o de tipo; essa responsabilidade passa do banco de dados para a camada de aplicativos com o Couchbase. Isso \u00e9 resolvido com bastante facilidade e, de qualquer forma, \u00e9 uma pr\u00e1tica melhor fazer com que os aplicativos de terceiros passem por uma API em vez de irem diretamente para o banco de dados. Mesmo no caso de v\u00e1rios aplicativos interagindo com o mesmo banco de dados, o uso de SOA tamb\u00e9m pode ser uma arquitetura melhor.<\/span><\/p>\n<p class=\"p3\"><strong>P: Como voc\u00ea \"encontra\" o tamanho (em termos de bytes no disco, por exemplo) de um determinado documento?<\/strong><\/p>\n<p class=\"p3\">R: N\u00e3o temos uma maneira de fazer isso para documentos individuais. Os documentos s\u00e3o compactados em disco, usando o Snappy, portanto, voc\u00ea pode obter uma taxa de compacta\u00e7\u00e3o m\u00e9dia do tamanho do documento do lado do cliente (json bruto n\u00e3o compactado) e, em seguida, obter uma compacta\u00e7\u00e3o arbitr\u00e1ria de 40% para ver o espa\u00e7o ocupado em disco. Ou voc\u00ea pode fazer uma m\u00e9dia observando o n\u00famero de itens (documentos), pegando o uso do disco e dividindo-o para ver o tamanho m\u00e9dio do documento no disco.<\/p>\n<p class=\"p3\"><strong>P: Como \"atualizar\" o(s) item(ns) json, por exemplo, o carimbo de data\/hora da atualiza\u00e7\u00e3o do documento, usando qualquer forma, mas n\u00e3o manualmente?<\/strong><\/p>\n<p class=\"p3\">R: N\u00e3o h\u00e1 mecanismo autom\u00e1tico para atualizar chaves json individuais em um documento json. Documentos inteiros s\u00e3o transmitidos para frente e para tr\u00e1s com opera\u00e7\u00f5es CRUD. Se voc\u00ea estiver atualizando qualquer chave json com um novo valor, isso ser\u00e1 feito no lado do cliente, incluindo, entre outros, a atualiza\u00e7\u00e3o de um carimbo de data\/hora.<\/p>\n<p class=\"p3\"><strong>P: Como voc\u00ea lida com as atualiza\u00e7\u00f5es de dados, isso n\u00e3o consumir\u00e1 muito tempo?<\/strong><\/p>\n<p class=\"p3\">R: Se voc\u00ea estiver se referindo apenas \u00e0 atualiza\u00e7\u00e3o do documento JSON, \u00e9 claro que a opera\u00e7\u00e3o de substitui\u00e7\u00e3o em sub-milissegundos n\u00e3o \u00e9 o que voc\u00ea est\u00e1 falando. Portanto, tive de presumir, para responder a essa pergunta, que voc\u00ea est\u00e1 se referindo \u00e0 migra\u00e7\u00e3o de uma estrutura de documento JSON para outra, como um documento de usu\u00e1rio que tem algumas chaves JSON e que voc\u00ea deseja adicionar\/remover\/transformar. Como mencionei no webinar, voc\u00ea pode fazer isso de v\u00e1rias maneiras. \u00c9 claro que ele assume duas formas diferentes: uma delas \u00e9 o estilo de trabalho em lote\/cron, em que voc\u00ea itera pelos documentos e faz a transforma\u00e7\u00e3o\/muta\u00e7\u00e3o. O tempo que isso leva depende do tamanho do seu conjunto de dados, de quantas m\u00e1quinas est\u00e3o no cluster do Couchbase e de quantas m\u00e1quinas est\u00e3o fazendo as transforma\u00e7\u00f5es. Portanto, \"demorado\" \u00e9 uma avalia\u00e7\u00e3o relativa. A outra maneira de lidar com isso seria transformar os documentos \"sob demanda\", ou seja, quando eles s\u00e3o recuperados pelo uso normal do seu aplicativo. Por exemplo, quando um usu\u00e1rio faz um login, voc\u00ea pode recuperar o documento do usu\u00e1rio, transform\u00e1-lo e substitu\u00ed-lo no Couchbase.<\/p>\n<p class=\"p3\"><strong>P: O que Jasdeep n\u00e3o mencionou \u00e9 que os dados precisam residir na mem\u00f3ria (pelo menos para justificar a velocidade). Ent\u00e3o, qual \u00e9 a vantagem sobre um banco de dados relacional na mem\u00f3ria que suporta SQL avan\u00e7ado? Eles tamb\u00e9m fazem um bom clustering ...<\/strong><\/p>\n<p class=\"p2\">R: Se voc\u00ea estiver fazendo um \u00fanico n\u00f3 em escala vertical de um banco de dados relacional na mem\u00f3ria, o limite ser\u00e1 a escala vertical dessa \u00fanica m\u00e1quina. Quando voc\u00ea tiver mais de um servidor e jun\u00e7\u00f5es (e particularmente jun\u00e7\u00f5es distribu\u00eddas), encontrar\u00e1 gargalos de desempenho semelhantes aos ancestrais vinculados a disco, puramente por causa da f\u00edsica. Se voc\u00ea fizer uma uni\u00e3o por meio de uma conex\u00e3o de rede em muitas tabelas grandes, n\u00e3o importa como voc\u00ea a fa\u00e7a, ela ser\u00e1 lenta e, se voc\u00ea a fizer com frequ\u00eancia, todo o desempenho ser\u00e1 degradado em escala.<\/p>\n<p class=\"p3\"><strong>P: Em um padr\u00e3o Counter-ID para usu\u00e1rios, onde residir\u00e1 o valor da contagem de usu\u00e1rios?<\/strong><\/p>\n<p class=\"p2\">R: \u00c9 um valor inteiro positivo simples com uma chave, como \"user::count\". Certifique-se de incrementar apenas o contador! E siga-o com uma opera\u00e7\u00e3o de adi\u00e7\u00e3o em vez de um conjunto, dessa forma, se houver um erro de l\u00f3gica, voc\u00ea o detectar\u00e1.<\/p>\n<p class=\"p3\"><strong>P: Como voc\u00ea faria um MapReduce de \u00edndice reverso (invertido)?<\/strong><\/p>\n<p class=\"p2\">R: Esse assunto est\u00e1 mais no t\u00f3pico do webinar Couchbase 104: Views. Mas os \u00edndices reversos s\u00e3o complicados com o Map-Reduce, voc\u00ea pode cri\u00e1-los emitindo a tag para quando ela ocorrer e, em seguida, fazer uma consulta de intervalo para essa tag.<\/p>\n<p class=\"p3\"><strong>P: Quando voc\u00ea divide documentos em v\u00e1rios documentos?<\/strong><\/p>\n<p class=\"p2\">R: Em geral, h\u00e1 tr\u00eas motivos para pensar em dividir um documento em v\u00e1rios documentos. O primeiro \u00e9 que uma determinada a\u00e7\u00e3o do usu\u00e1rio pode modificar um documento que tamb\u00e9m pode ser modificado por outra a\u00e7\u00e3o do usu\u00e1rio (e ambas s\u00e3o frequentes). Se v\u00e1rios usu\u00e1rios puderem modificar o mesmo documento em um determinado momento (ou quase provavelmente simultaneamente), isso \u00e9 uma \"condi\u00e7\u00e3o de corrida\" e voc\u00ea deve isolar esse documento e usar opera\u00e7\u00f5es CAS. O segundo caso \u00e9 quando um \u00fanico documento pode ser \"inchado\" ou muito grande e, nesse caso, pode ser mais eficiente dividi-lo em termos de c\u00f3digo e manuten\u00e7\u00e3o de c\u00f3digo. Em terceiro lugar, se voc\u00ea estiver usando um contador at\u00f4mico para representar um componente espec\u00edfico de um objeto\/classe. Isso ter\u00e1 que ser seu pr\u00f3prio par chave-valor, independente do documento JSON prim\u00e1rio, \u00e9 claro.<\/p>\n<p class=\"p3\"><strong>P: Como voc\u00ea faria uma pesquisa se tivesse um ID de navio e Lat\/Long e quisesse pesquisar por qualquer um dos par\u00e2metros?<\/strong><\/p>\n<p class=\"p2\">R: Nesse caso, como as coordenadas geogr\u00e1ficas t\u00eam precis\u00e3o de tr\u00eas casas decimais, nenhum padr\u00e3o de chave o ajudar\u00e1 com isso. No entanto, temos duas op\u00e7\u00f5es para fazer buscas do tipo de informa\u00e7\u00e3o que voc\u00ea deseja. Nossas visualiza\u00e7\u00f5es gerais Map\/Reduce s\u00e3o mais do que satisfat\u00f3rias, mas tamb\u00e9m temos visualiza\u00e7\u00f5es especializadas com Geo. Elas permitem a pesquisa em caixas delimitadas e outras t\u00e9cnicas geogr\u00e1ficas mais avan\u00e7adas. N\u00e3o falo especificamente sobre isso no webinar Couchbase 104: Views, mas entre em contato comigo se estiver interessado em saber mais ou se precisar de ajuda com rela\u00e7\u00e3o ao Geo e ao Couchbase.<\/p>\n<p class=\"p3\"><strong>P: Contar os usu\u00e1rios \u00e9 uma maneira melhor (com a fun\u00e7\u00e3o .incr()) de criar o ID do usu\u00e1rio do que, por exemplo, um grande n\u00famero aleat\u00f3rio ou um GUID? Estou falando do caso em que pode haver muitos novos usu\u00e1rios por segundo. A contagem n\u00e3o causar\u00e1 mais conflitos do que uma grande chave aleat\u00f3ria que tem uma probabilidade muito baixa de conflito?<\/strong><\/p>\n<p class=\"p2\">R: Como os contadores at\u00f4micos s\u00e3o, bem, at\u00f4micos, ent\u00e3o voc\u00ea pode contar com eles (em um \u00fanico cluster) para serem executados em ordem. Se todos os seus servidores de aplicativos estiverem apontando para esse cluster, todos eles estar\u00e3o executando opera\u00e7\u00f5es incr simultaneamente. Mas como elas s\u00e3o at\u00f4micas, cada opera\u00e7\u00e3o de cada servidor de aplicativos executando opera\u00e7\u00f5es gerar\u00e1 um novo n\u00famero inteiro, portanto, todas ser\u00e3o exclusivas. Se voc\u00ea nunca usar uma opera\u00e7\u00e3o decr (diminuir), n\u00e3o ter\u00e1 problemas. A situa\u00e7\u00e3o fica um pouco mais complexa se voc\u00ea tiver v\u00e1rios data centers e estiver usando XDCR (Cross Data Center Replication). Nesses casos, \u00e9 melhor prefixar seus contadores pelo ID do data center (que voc\u00ea criou).<\/p>\n<p class=\"p3\"><strong>P: Estou usando a gem couchbase-model no Rails e estou tendo dificuldades para entender o Counter-ID e o namespacing das chaves no paradigma do Rails, por exemplo, usando o m\u00e9todo Object.find() ou acessando\/incrementando refdocs n\u00e3o-JSON.  Voc\u00ea poderia postar um exemplo que misture e combine o Counter-ID com o Rails, incluindo o incremento a partir do bucket do Model?<\/strong><\/p>\n<p class=\"p2\">R: Isso precisar\u00e1 de algo melhor do que um blog para ser mostrado. Vou pensar em uma maneira de montar um resumo e postar um link aqui. Mas me d\u00ea um pouco de tempo para fazer isso. :)<\/p>\n<p class=\"p3\"><strong>P: Existe uma maneira de obter v\u00e1rios documentos para diferentes ids. O exemplo em que estou pensando \u00e9 uma lista de IDs de usu\u00e1rios do Facebook que queremos mapear para seus documentos de usu\u00e1rio. Existe uma maneira de passar v\u00e1rios IDs do Facebook e receber de volta uma matriz de documentos?<\/strong><\/p>\n<p class=\"p3\">R: Temos uma opera\u00e7\u00e3o multi-get em cada sdk apenas para essa finalidade. Na matriz resultante, se o documento n\u00e3o existir, ele ter\u00e1 um elemento null\/nill para indicar isso (talvez o Java tenha um retorno diferente, terei de verificar, mas sei que ele tamb\u00e9m tem).<\/p>\n<p class=\"p3\"><strong>P: As visualiza\u00e7\u00f5es s\u00e3o a \u00fanica maneira de usar chaves compostas? Existe uma maneira de us\u00e1-las com chaves get ou setup para usar esse tipo de funcionalidade sem uma visualiza\u00e7\u00e3o? <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/understanding-grouplevel-view-queries-compound-keys\/\">https:\/\/www.couchbase.com\/blog\/understanding-grouplevel-view-queries-compound-keys<\/a>\u00a0<\/strong><\/p>\n<p class=\"p2\">R: Esse \u00e9 mais um t\u00f3pico para o Couchbase 104: Visualiza\u00e7\u00f5es e indexa\u00e7\u00e3o, mas basicamente uma chave pode ser o que voc\u00ea quiser, portanto, tecnicamente, sim, voc\u00ea pode ter uma chave composta (depende apenas de como voc\u00ea define composta). No entanto, o link ao qual voc\u00ea est\u00e1 se referindo est\u00e1 focado na consulta de um \u00edndice de visualiza\u00e7\u00e3o, e esses tamb\u00e9m t\u00eam chaves, chaves de \u00edndice, com as quais constru\u00edmos nossas \u00e1rvores B+. Nesse caso, voc\u00ea est\u00e1 pegando partes da chave e dividindo-as com base no delimitador \",\" (v\u00edrgula). Estamos falando de um assunto diferente.<\/p>\n<p class=\"p3\"><strong>P: No momento, estamos usando uma exibi\u00e7\u00e3o para pesquisar o ID de usu\u00e1rio do Facebook para obter nosso pr\u00f3prio ID de usu\u00e1rio do aplicativo. Parece que, se realmente usarmos o padr\u00e3o de pesquisa que voc\u00ea sugeriu, isso pode ser mais r\u00e1pido do que usar uma visualiza\u00e7\u00e3o?<\/strong><\/p>\n<p class=\"p2\">R: Sim, e \u00e9 claro que isso depende. A escala tamb\u00e9m \u00e9 um fator aqui. Quanto mais n\u00f3s houver no cluster, mais amplo ser\u00e1 o processo de coleta e dispers\u00e3o da consulta do View, ou seja, mais n\u00f3s ter\u00e3o de ser dispersos e coletados em termos de resultados da consulta do View. Portanto, apenas pela f\u00edsica, a pesquisa ser\u00e1 mais r\u00e1pida. A desvantagem \u00e9 que voc\u00ea est\u00e1 adicionando mais documentos e, portanto, mais requisitos de RAM\/metadados, mas, como resultado, est\u00e1 ganhando uma tremenda escalabilidade, porque as opera\u00e7\u00f5es bin\u00e1rias passam por uma conex\u00e3o persistente com um servidor para o facebook_id-&gt;app_user_id e, novamente, uma segunda opera\u00e7\u00e3o bin\u00e1ria para o mesmo ou outro n\u00f3 por meio de uma conex\u00e3o persistente sempre ser\u00e1 mais r\u00e1pida do que espalhar uma consulta View por todos os n\u00f3s e coletar os resultados. As visualiza\u00e7\u00f5es s\u00e3o muito poderosas porque s\u00e3o mais flex\u00edveis do que os padr\u00f5es de chave; entretanto, nesse cen\u00e1rio, opte pela velocidade.<\/p>\n<p class=\"p3\"><strong>P: As exibi\u00e7\u00f5es t\u00eam uma op\u00e7\u00e3o obsoleta que parece poder atenuar o problema de const\u00e2ncia em compara\u00e7\u00e3o com duas chamadas get separadas. \u00c9 realmente mais r\u00e1pido ter duas chamadas para o banco de dados do que uma visualiza\u00e7\u00e3o bem gerenciada? Eu poderia me preocupar com a escala, duas chamadas em vez de uma em uma visualiza\u00e7\u00e3o.<\/strong><\/p>\n<p class=\"p2\">R: Isso n\u00e3o atenua o problema de consist\u00eancia. Os \u00edndices s\u00e3o sempre consistentes no Couchbase (at\u00e9 que n\u00f3s mesmos os desenvolvamos, o que est\u00e1 no radar), mas veja a pergunta\/resposta acima e assista a Couchbase 104: Views and Indexes! Isso pode mudar sua opini\u00e3o.<\/p>\n<p class=\"p3\"><strong>P: No exemplo que voc\u00ea est\u00e1 demonstrando, estamos discutindo sobre um \u00fanico documento e seus atributos\/propriedades via JSON.\u00a0<span style=\"font-family: inherit;font-size: 1em;line-height: 1.4375em\">Como lidamos com o fato de voc\u00ea querer obter estat\u00edsticas\/contagem em v\u00e1rios objetos\/documentos?\u00a0<\/span><span style=\"font-family: inherit;font-size: 1em;line-height: 1.4375em\">Por exemplo: a)\u00a0<\/span><span style=\"font-family: inherit;font-size: 1em;line-height: 1.4375em\">me traga todos os usu\u00e1rios com a cor favorita azul? b)\u00a0<\/span><span style=\"font-family: inherit;font-size: 1em;line-height: 1.4375em\">me informar todos os usu\u00e1rios que usam cart\u00e3o de cr\u00e9dito Visa?<\/span><\/strong><\/p>\n<p class=\"p2\">R: Isso requer visualiza\u00e7\u00f5es e a t\u00e9cnica Map\/Reduce para reunir todos esses elementos de dados de documentos e coloc\u00e1-los em uma estrutura de \u00edndice para que voc\u00ea possa fazer consultas como essas. Esse \u00e9 um bom exemplo de coisas que voc\u00ea n\u00e3o pode realmente fazer com padr\u00f5es-chave e requer integra\u00e7\u00e3o com VIews e\/ou Elastic Search. Nesses cen\u00e1rios de que voc\u00ea est\u00e1 falando, voc\u00ea poderia usar qualquer uma das solu\u00e7\u00f5es.<\/p>\n<p class=\"p3\"><strong>P: *Require* views\/map-reduce? Que tal armazenar o segundo documento u::uuid { email:user@domain.com } para depois acessar u:user@domain.com? Quando isso deve ser feito por meio de view\/map-reduce?<\/strong><\/p>\n<p class=\"p2\">R: Essa pergunta estava se referindo ao que acontece sem um padr\u00e3o Lookup. Se voc\u00ea tiver chaves de documento geradas aleatoriamente, normalmente precisar\u00e1 criar um \u00edndice para poder pesquisar documentos por meio de diferentes propriedades JSON. No entanto, se voc\u00ea criar um padr\u00e3o Lookup, poder\u00e1 fazer uma busca dupla para obter o documento principal; a primeira busca ser\u00e1 baseada em informa\u00e7\u00f5es conhecidas (endere\u00e7o de e-mail), o valor ser\u00e1 o ID gerado aleatoriamente que est\u00e1 associado ao documento principal; a segunda busca usar\u00e1 esse valor e obter\u00e1 o documento principal.<\/p>\n<p class=\"p3\"><strong>P: Qual \u00e9 a melhor maneira de consultar esses documentos de notifica\u00e7\u00e3o?<\/strong><\/p>\n<p class=\"p2\">R: No exemplo que eu estava mencionando, as pr\u00f3prias chaves s\u00e3o registros de data e hora para quando as notifica\u00e7\u00f5es devem ser entregues. Aqui est\u00e1 um resumo que pode ajudar a explicar o paradigma:\u00a0<a href=\"https:\/\/gist.github.com\/scalabl3\/7235173\">https:\/\/gist.github.com\/scalabl3\/7235173<\/a><\/p>\n<p class=\"p3\"><strong>P: O principal objetivo da normaliza\u00e7\u00e3o \u00e9 evitar anomalias de atualiza\u00e7\u00e3o; como todos os programas t\u00eam bugs, existe uma maneira no couchbase de evitar essas anomalias de atualiza\u00e7\u00e3o e n\u00e3o ter que depender do desenvolvedor \"acertar\"?<\/strong><\/p>\n<p class=\"p2\">R: O principal objetivo da normaliza\u00e7\u00e3o era economizar espa\u00e7o em disco. Se voc\u00ea olhar para tr\u00e1s, na \u00e9poca em que o SQL foi criado, obter cerca de 1 GB de armazenamento em disco (o que n\u00e3o era poss\u00edvel em um \u00fanico disco) era cerca de $700.000. A normaliza\u00e7\u00e3o reduziu a redund\u00e2ncia de dados ao apontar para os mesmos dados de v\u00e1rios lugares e, em seguida, remontar esses dados agregando-os ou juntando-os. Na pr\u00e1tica, ficou claro muito rapidamente que, se voc\u00ea estiver inserindo, atualizando e excluindo dados em um esquema normalizado, se alguma parte falhar, a integridade dos dados vai por \u00e1gua abaixo. \u00c9 justamente por causa da normaliza\u00e7\u00e3o que as transa\u00e7\u00f5es s\u00e3o necess\u00e1rias! Em uma forma desnormalizada ou agregada, as transa\u00e7\u00f5es se tornam muito menos necess\u00e1rias, mas temos simultaneidade otimista e simultaneidade pessimista para ter transa\u00e7\u00f5es de documento \u00fanico e voc\u00ea pode usar um commit de duas fases.<\/p>\n<p class=\"p2\">Realmente n\u00e3o h\u00e1 prote\u00e7\u00e3o completa em nenhum sistema para os desenvolvedores que \"erram\". Avise-me se voc\u00ea descobrir isso :).<\/p>\n<p class=\"p3\"><strong>P: N\u00e3o seria vantajoso combinar o padr\u00e3o Counter-ID com o padr\u00e3o Lookup?<\/strong><\/p>\n<p class=\"p2\">R: Sem d\u00favida, \u00e9 vantajoso, porque assim voc\u00ea tamb\u00e9m tem uma contagem total de documentos para esse tipo. Se voc\u00ea usar a identifica\u00e7\u00e3o aleat\u00f3ria e a pesquisa, n\u00e3o ter\u00e1 a contagem total. Com a contagem total, voc\u00ea pode iterar pela cole\u00e7\u00e3o apenas gerando chaves em lotes at\u00e9 a contagem total. Caso contr\u00e1rio, voc\u00ea precisar\u00e1 criar uma visualiza\u00e7\u00e3o (um \u00edndice) para iterar pela cole\u00e7\u00e3o.<\/p>\n<p class=\"p3\"><strong>P: Um \u00edndice para o RDBMS tamb\u00e9m n\u00e3o lhe proporcionaria um desempenho linear?<\/strong><\/p>\n<p class=\"p2\">R: O desempenho \u00e9 excelente, desde que voc\u00ea possa viver em um \u00fanico servidor e dimension\u00e1-lo verticalmente. A bagun\u00e7a acontece quando voc\u00ea precisa dividir o tr\u00e1fego em mais de um servidor. \u00c9 nesse ponto que o nascimento de todos os novos bancos de dados que explodiram em cena pode ser rastreado no in\u00edcio dos anos 2000, quando o p\u00fablico \"explodiu\" a capacidade dos bancos de dados relacionais de lidar com grandes quantidades de tr\u00e1fego. Coisas como o memcached vieram primeiro, e depois os NoSQLs.<\/p>\n<p class=\"p3\"><strong>P: Por que n\u00e3o estender o CB com funcionalidades abstratas baseadas nesses padr\u00f5es, no lado do servidor? No momento, os padr\u00f5es precisam ser implementados individualmente no lado do cliente.<\/strong><\/p>\n<p class=\"p3\">R: \u00c9 uma ideia e, na verdade, acho que h\u00e1 alguma validade em faz\u00ea-la, mas tamb\u00e9m h\u00e1 um bom argumento do outro lado de que ela deve estar sob controle program\u00e1tico. Assim que voc\u00ea adiciona um novo recurso, as pessoas querem mexer nele :)<\/p>\n<h5 class=\"p3\">Obrigado por participar do Couchbase 103!<\/h5>\n<p>Jasdeep<br \/>\n<a href=\"https:\/\/twitter.com\/scalabl3\">@escal\u00e1vel<\/a><\/p>","protected":false},"excerpt":{"rendered":"<p>In our ongoing training series, a number of questions come up each time, I list them out with their respective answers below! Couchbase 103 &#8211; Document Modeling Q: Assuming you can store a document as XML rather than JSON, what [&hellip;]<\/p>","protected":false},"author":2,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1],"tags":[],"ppma_author":[8968],"class_list":["post-1535","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.7.1 (Yoast SEO v25.7) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Couchbase 103: Q &amp; A - The Couchbase Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/pt\/couchbase-103-q-and-a\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Couchbase 103: Q &amp; A\" \/>\n<meta property=\"og:description\" content=\"In our ongoing training series, a number of questions come up each time, I list them out with their respective answers below! Couchbase 103 &#8211; Document Modeling Q: Assuming you can store a document as XML rather than JSON, what [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/couchbase-103-q-and-a\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2013-10-29T08:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-06-28T08:37:03+00:00\" \/>\n<meta name=\"author\" content=\"The Couchbase Team\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"The Couchbase Team\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"14 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-103-q-and-a\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-103-q-and-a\/\"},\"author\":{\"name\":\"The Couchbase Team\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/764f4a6771ee19bc7af70b70a326fb93\"},\"headline\":\"Couchbase 103: Q &amp; A\",\"datePublished\":\"2013-10-29T08:00:00+00:00\",\"dateModified\":\"2023-06-28T08:37:03+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-103-q-and-a\/\"},\"wordCount\":3114,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-103-q-and-a\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"articleSection\":[\"Uncategorized\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/couchbase-103-q-and-a\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-103-q-and-a\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/couchbase-103-q-and-a\/\",\"name\":\"Couchbase 103: Q &amp; A - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-103-q-and-a\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-103-q-and-a\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2013-10-29T08:00:00+00:00\",\"dateModified\":\"2023-06-28T08:37:03+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-103-q-and-a\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/couchbase-103-q-and-a\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-103-q-and-a\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"width\":1800,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-103-q-and-a\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Couchbase 103: Q &amp; A\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/764f4a6771ee19bc7af70b70a326fb93\",\"name\":\"The Couchbase Team\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/7befc37d02226b59499817eafdec60c3\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/b4c18c758421903398e84d6c9560f319f39c665798d7d23e6a6f9dff8a8f984e?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/b4c18c758421903398e84d6c9560f319f39c665798d7d23e6a6f9dff8a8f984e?s=96&d=mm&r=g\",\"caption\":\"The Couchbase Team\"},\"description\":\"Jennifer Garcia is a Senior Web Manager at Couchbase Inc. As the website manager, Jennifer has overall responsibility for the website properties including design, implementation, content, and performance.\",\"sameAs\":[\"https:\/\/www.couchbase.com\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/jennifer-garcia\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Couchbase 103: Perguntas e respostas - O blog do Couchbase","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/pt\/couchbase-103-q-and-a\/","og_locale":"pt_BR","og_type":"article","og_title":"Couchbase 103: Q &amp; A","og_description":"In our ongoing training series, a number of questions come up each time, I list them out with their respective answers below! Couchbase 103 &#8211; Document Modeling Q: Assuming you can store a document as XML rather than JSON, what [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/couchbase-103-q-and-a\/","og_site_name":"The Couchbase Blog","article_published_time":"2013-10-29T08:00:00+00:00","article_modified_time":"2023-06-28T08:37:03+00:00","author":"The Couchbase Team","twitter_card":"summary_large_image","twitter_misc":{"Written by":"The Couchbase Team","Est. reading time":"14 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-103-q-and-a\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-103-q-and-a\/"},"author":{"name":"The Couchbase Team","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/764f4a6771ee19bc7af70b70a326fb93"},"headline":"Couchbase 103: Q &amp; A","datePublished":"2013-10-29T08:00:00+00:00","dateModified":"2023-06-28T08:37:03+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-103-q-and-a\/"},"wordCount":3114,"commentCount":1,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-103-q-and-a\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","articleSection":["Uncategorized"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/couchbase-103-q-and-a\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-103-q-and-a\/","url":"https:\/\/www.couchbase.com\/blog\/couchbase-103-q-and-a\/","name":"Couchbase 103: Perguntas e respostas - O blog do Couchbase","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-103-q-and-a\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-103-q-and-a\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2013-10-29T08:00:00+00:00","dateModified":"2023-06-28T08:37:03+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-103-q-and-a\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/couchbase-103-q-and-a\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-103-q-and-a\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","width":1800,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-103-q-and-a\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Couchbase 103: Q &amp; A"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"Blog do Couchbase","description":"Couchbase, o banco de dados NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"Blog do Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/764f4a6771ee19bc7af70b70a326fb93","name":"A equipe do Couchbase","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/7befc37d02226b59499817eafdec60c3","url":"https:\/\/secure.gravatar.com\/avatar\/b4c18c758421903398e84d6c9560f319f39c665798d7d23e6a6f9dff8a8f984e?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/b4c18c758421903398e84d6c9560f319f39c665798d7d23e6a6f9dff8a8f984e?s=96&d=mm&r=g","caption":"The Couchbase Team"},"description":"Jennifer Garcia \u00e9 gerente s\u00eanior de Web na Couchbase Inc. Como gerente do site, Jennifer tem a responsabilidade geral pelas propriedades do site, incluindo design, implementa\u00e7\u00e3o, conte\u00fado e desempenho.","sameAs":["https:\/\/www.couchbase.com"],"url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/jennifer-garcia\/"}]}},"authors":[{"term_id":8968,"user_id":2,"is_guest":0,"slug":"jennifer-garcia","display_name":"The Couchbase Team","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/b4c18c758421903398e84d6c9560f319f39c665798d7d23e6a6f9dff8a8f984e?s=96&d=mm&r=g","first_name":"Jennifer","last_name":"Garcia","user_url":"https:\/\/www.couchbase.com","author_category":"","description":"Jennifer Garcia \u00e9 gerente s\u00eanior de Web na Couchbase Inc. Como gerente do site, Jennifer tem a responsabilidade geral pelas propriedades do site, incluindo design, implementa\u00e7\u00e3o, conte\u00fado e desempenho."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/1535","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=1535"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/1535\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=1535"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=1535"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=1535"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=1535"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}