{"id":14976,"date":"2023-10-18T12:18:34","date_gmt":"2023-10-18T19:18:34","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=14976"},"modified":"2025-06-13T20:28:38","modified_gmt":"2025-06-14T03:28:38","slug":"manage-data-sprawl-developers","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/manage-data-sprawl-developers\/","title":{"rendered":"Gerenciando a dispers\u00e3o de dados para desenvolvedores"},"content":{"rendered":"<p><span style=\"font-weight: 400;\">Quando n\u00f3s, desenvolvedores, ouvimos o termo expans\u00e3o de dados, ele pode parecer um pouco com um termo comercial como TCO, ROI e similares. Todos esses termos t\u00eam uma realidade para os desenvolvedores, fora do \u00e2mbito do analista e do gerente. Portanto, hoje quero falar sobre a realidade da expans\u00e3o de dados para os desenvolvedores. Como isso afeta nosso trabalho.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">O Data Sprawl pode ser resumido no fato de que temos dados, uma quantidade enorme, armazenados em muitos armazenamentos de dados diferentes. Al\u00e9m disso, n\u00f3s, como desenvolvedores, temos que fazer com que esses armazenamentos de dados interajam entre si. E, \u00e9 claro, quanto mais, melhor, certo \ud83d\ude2c?<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Geralmente est\u00e1 associado a custos financeiros mais altos:<\/span><\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Infraestrutura<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Licen\u00e7as<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Integra\u00e7\u00e3o<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Treinamento<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Operacional<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Custos de suporte<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">Plataformas separadas com v\u00e1rias interfaces lhe dar\u00e3o dores de cabe\u00e7a por causa disso:<\/span><\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Implementa\u00e7\u00e3o e gerenciamento independentes<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Diferentes modelos de dados e interfaces de programa\u00e7\u00e3o<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Integra\u00e7\u00e3o entre v\u00e1rios produtos<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">T\u00edquetes de suporte com diferentes fornecedores<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">E precisamos gastar mais tempo, esfor\u00e7os e custos por causa disso:<\/span><\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Licen\u00e7a e contrato<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Treinamento para desenvolvedores e opera\u00e7\u00f5es<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Suporte\u00a0<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Criar API ou conector para o banco de dados<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Aquisi\u00e7\u00e3o de infraestrutura<\/span><\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<p><span style=\"font-weight: 400;\">\u00c9 um pouco sombrio quando se olha dessa forma, mas \u00e9 um desafio cotidiano para muitas empresas. E n\u00e3o apenas com diferentes cargas de trabalho de dados, isso tamb\u00e9m se aplica aos aplicativos em nuvem.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Vamos dar uma olhada em um exemplo espec\u00edfico. Criei um aplicativo que usa CRUD de um banco de dados de documentos, cache de um armazenamento de cache e pesquisa de um mecanismo de pesquisa de texto completo. (<a href=\"https:\/\/github.com\/ldoguin\/datasprawl-couchbase-redis-elastic-mongo\">Fonte do GitHub<\/a>)<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Dando uma olhada nesse esquema, voc\u00ea pode basicamente contar cada seta que v\u00ea como uma intera\u00e7\u00e3o entre diferentes sistemas que os desenvolvedores precisam pensar e codificar.<\/span><\/p>\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/10\/image2.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-14978\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/10\/image2-1024x576.png\" alt=\"\" width=\"900\" height=\"506\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2023\/10\/image2-1024x576.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2023\/10\/image2-300x169.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2023\/10\/image2-768x432.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2023\/10\/image2.png 1280w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\">Aqui estamos sincronizando automaticamente os bancos de dados de cache e pesquisa usando streaming de eventos. S\u00e3o 8 intera\u00e7\u00f5es e 4 armazenamentos de dados para aprender e gerenciar. Como voc\u00ea precisa garantir que cada armazenamento esteja conectado ao servi\u00e7o de streaming e que receba as atualiza\u00e7\u00f5es corretas, \u00e9 necess\u00e1rio gerenciar o servi\u00e7o de streaming, a pesquisa, o cache e o armazenamento de dados. Voc\u00ea tamb\u00e9m precisa integrar o cache ao seu servi\u00e7o CRUD (idealmente com os outros servi\u00e7os, mas vamos manter isso simples). Em resumo: h\u00e1 muito o que fazer. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">Podemos limitar essas intera\u00e7\u00f5es eliminando os servi\u00e7os de streaming e garantindo que outros servi\u00e7os sejam atualizados manualmente. Essa \u00e9 uma licen\u00e7a a menos, algo a ser operado, algo a ser aprendido, algo a ser integrado. Ainda n\u00e3o \u00e9 o ideal, mas poderia ser assim:<\/span><\/p>\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/10\/image1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-14979\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/10\/image1-1024x576.png\" alt=\"\" width=\"900\" height=\"506\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2023\/10\/image1-1024x576.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2023\/10\/image1-300x169.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2023\/10\/image1-768x432.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2023\/10\/image1.png 1280w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\">\u00c9 um pouco mais simples, apenas 6 intera\u00e7\u00f5es e 3 armazenamentos de dados em vez de 8 e 4. Mas ainda h\u00e1 muitas intera\u00e7\u00f5es e parte da integra\u00e7\u00e3o de streaming precisa ser feita manualmente. Antes, por\u00e9m, poder\u00edamos ter aprendido e usado os conectores existentes entre os servi\u00e7os existentes. Vamos dar uma olhada r\u00e1pida no c\u00f3digo de amostra Java\/Spring Boot escrito para isso.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">H\u00e1 quatro interfaces que representam o que os desenvolvedores podem fazer com os armazenamentos de dados. CRUD, Cache, Consulta e Pesquisa.<\/span><\/p>\n<pre class=\"nums:false lang:java decode:true\">public interface CRUD {\u00a0\u00a0\r\n\u00a0\u00a0\u00a0\u00a0StoredFileDocument read(String id);\r\n\u00a0\u00a0\u00a0\u00a0void create(String id, StoredFileDocument doc);\r\n\u00a0\u00a0\u00a0\u00a0void update(String id, StoredFileDocument doc);\r\n\u00a0\u00a0\u00a0\u00a0void upsert(String id, StoredFileDocument doc);\r\n\u00a0\u00a0\u00a0\u00a0void delete(String id);\r\n}\r\n\r\npublic interface Cache {\u00a0\r\n\u00a0\u00a0\u00a0\u00a0void writeInCache(StoredFileDocument doc);\r\n\u00a0\u00a0\u00a0\u00a0StoredFileDocument readFromCache(String id);\r\n\u00a0\u00a0\u00a0\u00a0void touch(String id);\r\n\u00a0\u00a0\u00a0\u00a0void evict(String id);\r\n}\r\n\r\npublic interface Query {\r\n\u00a0\u00a0\u00a0\u00a0List&lt;Map&lt;String, Object&gt;&gt; query(String whereClause);\u00a0\u00a0\u00a0\u00a0\r\n\u00a0\u00a0\u00a0\u00a0List&lt;Map&lt;String, Object&gt;&gt; findAll();\r\n}\r\n\r\npublic interface Search {\r\n\u00a0\u00a0\u00a0\u00a0List&lt;Map&lt;String, Object&gt;&gt; search(String term);\r\n\u00a0\u00a0\u00a0\u00a0void index(StoredFileDocument doc);\r\n\u00a0\u00a0\u00a0\u00a0void delete(String id);\r\n}<\/pre>\n<p><span style=\"font-weight: 400;\">N\u00e3o mostraremos todo o c\u00f3digo nesta postagem, mas apenas algumas das partes interessantes. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">Estamos em uma configura\u00e7\u00e3o em que o servi\u00e7o CRUD tem links para os servi\u00e7os Search e Cache. Vamos ver como seria em uma vers\u00e3o simplificada. Temos de importar o servi\u00e7o de cache e de pesquisa, pois eles s\u00e3o necess\u00e1rios. A partir da\u00ed, todos os m\u00e9todos s\u00e3o afetados por eles. O Read precisa primeiro consultar o cache, atualizar a \u00faltima vez que o objeto foi encontrado no cache ou obt\u00ea-lo do banco de dados e inseri-lo no cache. Em seguida, os m\u00e9todos Create, Update e Delete afetam o Cache e a Pesquisa, pois os dados rec\u00e9m-criados, atualizados ou exclu\u00eddos precisam ser propagados para o Cache ou para os \u00edndices do armazenamento de dados da Pesquisa.<\/span><\/p>\n<pre class=\"nums:false lang:java decode:true\">@Service\r\n\r\npublic class MongoCRUD implements CRUD {\r\n\u00a0\u00a0\u00a0\u00a0private MongoCollection&lt;StoredFileDocument&gt; collection;\r\n\u00a0\u00a0\u00a0\u00a0private Cache cache;\r\n\u00a0\u00a0\u00a0\u00a0private Search search;\r\n\r\n\u00a0\u00a0\u00a0\u00a0public MongoCRUD(MongoCollection&lt;StoredFileDocument&gt; collection, Cache cache, Search search) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0this.collection = collection;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0this.cache = cache;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0this.search = search;\r\n\u00a0\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0\u00a0@Override\r\n\u00a0\u00a0\u00a0\u00a0public StoredFileDocument read(String id) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0StoredFileDocument doc = cache.readFromCache(id);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (doc == null) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0System.out.println(id);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0doc = collection.find(eq(\"fileId\", id)).first();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0cache.writeInCache(doc);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0} else {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0cache.touch(id);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return doc;\r\n\u00a0\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0\u00a0@Override\r\n\u00a0\u00a0\u00a0\u00a0public void create(String id, StoredFileDocument doc) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0doc.setFileId(id);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0collection.insertOne(doc);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0cache.writeInCache(doc);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0search.index(doc);\r\n\u00a0\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0\u00a0@Override\r\n\u00a0\u00a0\u00a0\u00a0public void update(String id, StoredFileDocument doc) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0collection.findOneAndReplace(eq(\"fileId\", id), doc);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0cache.touch(id);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0search.index(doc);\r\n\u00a0\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0\u00a0@Override\r\n\u00a0\u00a0\u00a0\u00a0public void upsert(String id, StoredFileDocument doc) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0FindOneAndReplaceOptions options = new FindOneAndReplaceOptions().upsert(true);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0collection.findOneAndReplace(eq(\"fileId\", id), doc, options);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0cache.touch(id);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0search.index(doc);\r\n\u00a0\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0\u00a0@Override\r\n\u00a0\u00a0\u00a0\u00a0public void delete(String id) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0collection.deleteOne(eq(\"fileId\", id));\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0cache.evict(id);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0search.delete(id);\r\n\u00a0\u00a0\u00a0\u00a0}\r\n}\r\n\r\n<\/pre>\n<p>Com o Couchbase, isso estaria mais pr\u00f3ximo de algo como isto:<\/p>\n<pre class=\"nums:false lang:java decode:true\">@Service\r\n@Profile(\"couchbase\")\r\npublic class CouchbaseCRUD implements CRUD {\r\n\u00a0\u00a0\u00a0\u00a0private Collection collection;\r\n\u00a0\u00a0\u00a0\u00a0public CouchbaseCRUD(Collection collection) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0this.collection = collection;\r\n\u00a0\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0\u00a0@Override\r\n\u00a0\u00a0\u00a0\u00a0public StoredFileDocument read(String id) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0GetResult res = collection.get(id);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return res.contentAs(StoredFileDocument.class);\r\n\u00a0\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0\u00a0@Override\r\n\u00a0\u00a0\u00a0\u00a0public void create(String id, StoredFileDocument doc) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0MutationResult res = collection.insert(id, doc);\r\n\u00a0\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0\u00a0@Override\r\n\u00a0\u00a0\u00a0\u00a0public void update(String id, StoredFileDocument doc) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0MutationResult res = collection.replace(id, doc);\r\n\u00a0\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0\u00a0@Override\r\n\u00a0\u00a0\u00a0\u00a0public void upsert(String id, StoredFileDocument doc) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0MutationResult res = collection.upsert(id, doc);\r\n\u00a0\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0\u00a0@Override\r\n\u00a0\u00a0\u00a0\u00a0public void delete(String id) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0MutationResult res = collection.remove(id);\r\n\u00a0\u00a0\u00a0\u00a0}\r\n}<\/pre>\n<p><span style=\"font-weight: 400;\">O motivo pelo qual n\u00e3o precisamos de uma depend\u00eancia do servi\u00e7o de Cache e Pesquisa \u00e9 que o Couchbase j\u00e1 integra um cache e um mecanismo de pesquisa. N\u00e3o h\u00e1 necessidade de implementar a interface do cache e n\u00e3o h\u00e1 necessidade de implementar o m\u00e9todo de exclus\u00e3o e indexa\u00e7\u00e3o da interface de pesquisa. \u00c9 tudo automatizado e integrado.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Normalmente, quando explico isso a algu\u00e9m, segue-se uma conversa sobre como isso deve ser ruim, porque \u00e9 preciso fazer concess\u00f5es para poder fazer todas as coisas. Todas as plataformas de dados, multimodelos, cargas de trabalho m\u00faltiplas, como voc\u00ea quiser falar sobre elas, n\u00e3o s\u00e3o criadas da mesma forma, ou pelo menos n\u00e3o com a mesma arquitetura em mente.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">O Couchbase pode ser visto como v\u00e1rios bancos de dados diferentes, todos respons\u00e1veis por cargas de trabalho diferentes e todos integrados por meio de seu servi\u00e7o de streaming interno. Dessa forma, cada parte do Couchbase \u00e9 mantida atualizada automaticamente e cada parte pode se especializar em sua pr\u00f3pria carga de trabalho de dados. No final, voc\u00ea obt\u00e9m 3 intera\u00e7\u00f5es e 1 datastore.<\/span><\/p>\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/10\/image3.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-14980\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/10\/image3-1024x576.png\" alt=\"\" width=\"900\" height=\"506\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2023\/10\/image3-1024x576.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2023\/10\/image3-300x169.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2023\/10\/image3-768x432.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2023\/10\/image3.png 1280w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\">Isso j\u00e1 \u00e9 muito bom, mas temos mais uma coisa. Nossos servi\u00e7os est\u00e3o integrados \u00e0 nossa linguagem de consulta SQL++. Vamos dar um exemplo. Voc\u00ea tem um CMS que cont\u00e9m uma \u00e1rvore de documentos, com v\u00e1rias permiss\u00f5es em cada documento, e essas permiss\u00f5es podem ser herdadas por documentos filhos nos quais voc\u00ea deseja executar uma pesquisa como um usu\u00e1rio conectado com um conjunto espec\u00edfico de permiss\u00f5es. Se voc\u00ea estiver usando um mecanismo de busca externo, o que normalmente acontece \u00e9 o seguinte:<\/span><\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Execute uma consulta de pesquisa no mecanismo de pesquisa<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Re\u00fana os identificadores dos documentos retornados porque nem todo o conte\u00fado do documento est\u00e1 indexado<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Executar uma consulta para obter os documentos completos<\/span>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"2\"><span style=\"font-weight: 400;\">Se o seu servi\u00e7o de consulta n\u00e3o for compat\u00edvel com JOIN, execute outra consulta para obter permiss\u00f5es herdadas e filtrar os documentos<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<p><span style=\"font-weight: 400;\">Se quis\u00e9ssemos tornar as coisas mais complicadas (e talvez tamb\u00e9m mais reais), poder\u00edamos adicionar uma l\u00f3gica de cache personalizada a cada etapa. Mas isso j\u00e1 \u00e9 complicado o suficiente.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">O Couchbase pode fazer tudo em uma \u00fanica etapa. Em uma \u00fanica consulta SQL++, podemos pesquisar, selecionar os campos que desejamos e fazer JOIN em outros documentos para classificar as permiss\u00f5es. \u00c9 t\u00e3o simples quanto isso. Como o Couchbase \u00e9 uma plataforma de dados bem integrada, sua linguagem de consulta permite que voc\u00ea aproveite todos os seus poderes. Se voc\u00ea estiver interessado, os detalhes podem ser encontrados em outro post.<\/span><\/p>\n<h2>Encerramento<\/h2>\n<p><span style=\"font-weight: 400;\">Ent\u00e3o, o que aprendemos hoje? O uso de uma plataforma de dados bem arquitetada pode economizar muito tempo, dinheiro, esfor\u00e7o e dor de cabe\u00e7a. Porque, no final, voc\u00ea tem menos coisas em que pensar, menos c\u00f3digo para escrever, o que significa menos c\u00f3digo para manter e uma capacidade mais r\u00e1pida de enviar para a produ\u00e7\u00e3o. Felizmente, ela tamb\u00e9m simplifica e economiza em quest\u00f5es como licen\u00e7as, treinamento, conformidade e todas aquelas coisas com as quais os gerentes, analistas, seu chefe e o chefe do seu chefe se preocupam!<\/span><\/p>\n<ul>\n<li>Assista \u00e0 minha palestra com a RedMonk: <a href=\"https:\/\/redmonk.com\/videos\/what-is-data-sprawl-how-to-leverage-a-platform-to-wrangle-it\/\">O que \u00e9 dispers\u00e3o de dados? Como aproveitar uma plataforma para lidar com eles<\/a><\/li>\n<li>Confira o c\u00f3digo do meu <a href=\"https:\/\/github.com\/ldoguin\/datasprawl-couchbase-redis-elastic-mongo\">exemplo de expans\u00e3o de dados<\/a><\/li>\n<li>Saiba mais sobre como <a href=\"https:\/\/docs.couchbase.com\/server\/current\/learn\/services-and-indexes\/services\/services.html\">Servi\u00e7os do Couchbase<\/a> s\u00e3o projetados para tornar o desenvolvimento f\u00e1cil e simples.<\/li>\n<li>Experimente o <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/products\/capella\/\">Couchbase Capella DBaaS<\/a> para coloc\u00e1-lo \u00e0 prova<\/li>\n<\/ul>\n<p><iframe loading=\"lazy\" title=\"O que \u00e9 dispers\u00e3o de dados? Como aproveitar uma plataforma para lidar com eles\" width=\"900\" height=\"506\" src=\"https:\/\/www.youtube.com\/embed\/BsNafKBPxJU?feature=oembed&#038;enablejsapi=1&#038;origin=https:\/\/www.couchbase.com\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" allowfullscreen><\/iframe><\/p>\n<p>&nbsp;<\/p>","protected":false},"excerpt":{"rendered":"<p>When we developers hear the term data sprawl, it may sound a little bit like a business term like TCO, ROI and the likes. All these terms have a reality for developers, outside of the analyst and manager realm. So [&hellip;]<\/p>","protected":false},"author":49,"featured_media":14977,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1814,1815,2294,2225,1816,9936,1812,2201],"tags":[1580],"ppma_author":[9023],"class_list":["post-14976","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-application-design","category-best-practices-and-tutorials","category-analytics","category-cloud","category-couchbase-server","category-search","category-n1ql-query","category-tools-sdks","tag-data-service"],"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>Managing Data Sprawl for Developers - The Couchbase Blog<\/title>\n<meta name=\"description\" content=\"Using a well architected Data Platform can save you lots of time, money, effort and headache. Because, in the end, you have less code to write and maintain.\" \/>\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\/manage-data-sprawl-developers\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Managing Data Sprawl for Developers\" \/>\n<meta property=\"og:description\" content=\"Using a well architected Data Platform can save you lots of time, money, effort and headache. Because, in the end, you have less code to write and maintain.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/manage-data-sprawl-developers\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2023-10-18T19:18:34+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T03:28:38+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2023\/10\/data-service-sprawl-developer.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"628\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Laurent Doguin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@ldoguin\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"unstructured.io\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/manage-data-sprawl-developers\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/manage-data-sprawl-developers\/\"},\"author\":{\"name\":\"Laurent Doguin\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c0aa9b8f1ed51b7a9e2f7cb755994a5e\"},\"headline\":\"Managing Data Sprawl for Developers\",\"datePublished\":\"2023-10-18T19:18:34+00:00\",\"dateModified\":\"2025-06-14T03:28:38+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/manage-data-sprawl-developers\/\"},\"wordCount\":1162,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/manage-data-sprawl-developers\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2023\/10\/data-service-sprawl-developer.png\",\"keywords\":[\"data service\"],\"articleSection\":[\"Application Design\",\"Best Practices and Tutorials\",\"Couchbase Analytics\",\"Couchbase Capella\",\"Couchbase Server\",\"Search\",\"SQL++ \/ N1QL Query\",\"Tools &amp; SDKs\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/manage-data-sprawl-developers\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/manage-data-sprawl-developers\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/manage-data-sprawl-developers\/\",\"name\":\"Managing Data Sprawl for Developers - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/manage-data-sprawl-developers\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/manage-data-sprawl-developers\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2023\/10\/data-service-sprawl-developer.png\",\"datePublished\":\"2023-10-18T19:18:34+00:00\",\"dateModified\":\"2025-06-14T03:28:38+00:00\",\"description\":\"Using a well architected Data Platform can save you lots of time, money, effort and headache. Because, in the end, you have less code to write and maintain.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/manage-data-sprawl-developers\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/manage-data-sprawl-developers\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/manage-data-sprawl-developers\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2023\/10\/data-service-sprawl-developer.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2023\/10\/data-service-sprawl-developer.png\",\"width\":1200,\"height\":628,\"caption\":\"Reducing data sprawl for application developers\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/manage-data-sprawl-developers\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Managing Data Sprawl for Developers\"}]},{\"@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\/c0aa9b8f1ed51b7a9e2f7cb755994a5e\",\"name\":\"Laurent Doguin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/12929ce99397769f362b7a90d6b85071\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g\",\"caption\":\"Laurent Doguin\"},\"description\":\"Laurent is a nerdy metal head who lives in Paris. He mostly writes code in Java and structured text in AsciiDoc, and often talks about data, reactive programming and other buzzwordy stuff. He is also a former Developer Advocate for Clever Cloud and Nuxeo where he devoted his time and expertise to helping those communities grow bigger and stronger. He now runs Developer Relations at Couchbase.\",\"sameAs\":[\"https:\/\/x.com\/ldoguin\"],\"honorificPrefix\":\"Mr\",\"birthDate\":\"1985-06-07\",\"gender\":\"male\",\"award\":[\"Devoxx Champion\",\"Couchbase Legend\"],\"knowsAbout\":[\"Java\"],\"knowsLanguage\":[\"English\",\"French\"],\"jobTitle\":\"Director Developer Relation & Strategy\",\"worksFor\":\"Couchbase\",\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/laurent-doguin\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Managing Data Sprawl for Developers - The Couchbase Blog","description":"Using a well architected Data Platform can save you lots of time, money, effort and headache. Because, in the end, you have less code to write and maintain.","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\/manage-data-sprawl-developers\/","og_locale":"pt_BR","og_type":"article","og_title":"Managing Data Sprawl for Developers","og_description":"Using a well architected Data Platform can save you lots of time, money, effort and headache. Because, in the end, you have less code to write and maintain.","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/manage-data-sprawl-developers\/","og_site_name":"The Couchbase Blog","article_published_time":"2023-10-18T19:18:34+00:00","article_modified_time":"2025-06-14T03:28:38+00:00","og_image":[{"width":1200,"height":628,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2023\/10\/data-service-sprawl-developer.png","type":"image\/png"}],"author":"Laurent Doguin","twitter_card":"summary_large_image","twitter_creator":"@ldoguin","twitter_misc":{"Written by":"unstructured.io","Est. reading time":"6 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/manage-data-sprawl-developers\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/manage-data-sprawl-developers\/"},"author":{"name":"Laurent Doguin","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c0aa9b8f1ed51b7a9e2f7cb755994a5e"},"headline":"Managing Data Sprawl for Developers","datePublished":"2023-10-18T19:18:34+00:00","dateModified":"2025-06-14T03:28:38+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/manage-data-sprawl-developers\/"},"wordCount":1162,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/manage-data-sprawl-developers\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2023\/10\/data-service-sprawl-developer.png","keywords":["data service"],"articleSection":["Application Design","Best Practices and Tutorials","Couchbase Analytics","Couchbase Capella","Couchbase Server","Search","SQL++ \/ N1QL Query","Tools &amp; SDKs"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/manage-data-sprawl-developers\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/manage-data-sprawl-developers\/","url":"https:\/\/www.couchbase.com\/blog\/manage-data-sprawl-developers\/","name":"Managing Data Sprawl for Developers - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/manage-data-sprawl-developers\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/manage-data-sprawl-developers\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2023\/10\/data-service-sprawl-developer.png","datePublished":"2023-10-18T19:18:34+00:00","dateModified":"2025-06-14T03:28:38+00:00","description":"Using a well architected Data Platform can save you lots of time, money, effort and headache. Because, in the end, you have less code to write and maintain.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/manage-data-sprawl-developers\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/manage-data-sprawl-developers\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/manage-data-sprawl-developers\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2023\/10\/data-service-sprawl-developer.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2023\/10\/data-service-sprawl-developer.png","width":1200,"height":628,"caption":"Reducing data sprawl for application developers"},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/manage-data-sprawl-developers\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Managing Data Sprawl for Developers"}]},{"@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\/c0aa9b8f1ed51b7a9e2f7cb755994a5e","name":"Laurent Doguin","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/12929ce99397769f362b7a90d6b85071","url":"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g","caption":"Laurent Doguin"},"description":"Laurent \u00e9 um nerd metaleiro que mora em Paris. Em sua maior parte, ele escreve c\u00f3digo em Java e texto estruturado em AsciiDoc, e frequentemente fala sobre dados, programa\u00e7\u00e3o reativa e outras coisas que est\u00e3o na moda. Ele tamb\u00e9m foi Developer Advocate do Clever Cloud e do Nuxeo, onde dedicou seu tempo e experi\u00eancia para ajudar essas comunidades a crescerem e se fortalecerem. Atualmente, ele dirige as Rela\u00e7\u00f5es com Desenvolvedores na Couchbase.","sameAs":["https:\/\/x.com\/ldoguin"],"honorificPrefix":"Mr","birthDate":"1985-06-07","gender":"male","award":["Devoxx Champion","Couchbase Legend"],"knowsAbout":["Java"],"knowsLanguage":["English","French"],"jobTitle":"Director Developer Relation & Strategy","worksFor":"Couchbase","url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/laurent-doguin\/"}]}},"authors":[{"term_id":9023,"user_id":49,"is_guest":0,"slug":"laurent-doguin","display_name":"Laurent Doguin","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g","first_name":"Laurent","last_name":"Doguin","user_url":"","author_category":"","description":"Laurent \u00e9 um nerd metaleiro que mora em Paris. Em sua maior parte, ele escreve c\u00f3digo em Java e texto estruturado em AsciiDoc, e frequentemente fala sobre dados, programa\u00e7\u00e3o reativa e outras coisas que est\u00e3o na moda. Ele tamb\u00e9m foi Developer Advocate do Clever Cloud e do Nuxeo, onde dedicou seu tempo e experi\u00eancia para ajudar essas comunidades a crescerem e se fortalecerem. Atualmente, ele dirige as Rela\u00e7\u00f5es com Desenvolvedores na Couchbase."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/14976","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\/49"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=14976"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/14976\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/14977"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=14976"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=14976"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=14976"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=14976"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}