{"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\/es\/manage-data-sprawl-developers\/","title":{"rendered":"Gesti\u00f3n de la dispersi\u00f3n de datos para desarrolladores"},"content":{"rendered":"<p><span style=\"font-weight: 400;\">Cuando los desarrolladores o\u00edmos el t\u00e9rmino dispersi\u00f3n de datos, puede sonar un poco como un t\u00e9rmino de negocios como TCO, ROI y similares. Todos estos t\u00e9rminos tienen una realidad para los desarrolladores, fuera del \u00e1mbito de los analistas y gestores. As\u00ed que hoy quiero hablarte de la realidad de la dispersi\u00f3n de datos para los desarrolladores. C\u00f3mo afecta a nuestro trabajo.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">La dispersi\u00f3n de datos se puede resumir en que tenemos datos, una cantidad enorme, almacenados en muchos almacenes de datos diferentes. Y encima, nosotros como desarrolladores tenemos que hacer que esos almacenes de datos interact\u00faen entre s\u00ed. Y claro, cuantos m\u00e1s, mejor, \u00bfno \ud83d\ude2c?<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Suele asociarse a mayores costes financieros en:<\/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;\">Infraestructura<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Licencias<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Integraci\u00f3n<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Formaci\u00f3n<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Operativo<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Gastos de apoyo<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">Las plataformas separadas con m\u00faltiples interfaces te dar\u00e1n dolores de cabeza por:<\/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;\">Implantaci\u00f3n y gesti\u00f3n independientes<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Diferentes modelos de datos e interfaces de programaci\u00f3n<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Integraci\u00f3n entre varios productos<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Tickets de soporte con diferentes proveedores<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">Y tenemos que dedicar m\u00e1s tiempo, esfuerzos y costes a causa de:<\/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;\">Licencia y acuerdo<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Formaci\u00f3n para desarrolladores y operaciones<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Ayuda\u00a0<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Construir API o conector a base de datos<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Adquirir infraestructura<\/span><\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<p><span style=\"font-weight: 400;\">Resulta un poco sombr\u00edo cuando se mira as\u00ed, pero es un reto cotidiano para muchas empresas. Y no solo con las diferentes cargas de trabajo de datos, tambi\u00e9n ocurre con las aplicaciones en la nube.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Veamos un ejemplo concreto. He creado una aplicaci\u00f3n que utiliza CRUD de una base de datos de documentos, Cach\u00e9 de un almac\u00e9n de cach\u00e9, y b\u00fasqueda de un motor de b\u00fasqueda de texto completo. (<a href=\"https:\/\/github.com\/ldoguin\/datasprawl-couchbase-redis-elastic-mongo\">Fuente GitHub<\/a>)<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Echando un vistazo a este esquema, b\u00e1sicamente puedes contar cada flecha que ves como una interacci\u00f3n entre diferentes sistemas que los desarrolladores tienen que pensar y 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;\">Aqu\u00ed estamos sincronizando autom\u00e1ticamente las bases de datos de Cach\u00e9 y B\u00fasqueda utilizando streaming de eventos. Esto supone 8 interacciones y 4 almacenes de datos que aprender y gestionar. Como necesitas asegurarte de que cada almac\u00e9n est\u00e1 conectado con el servicio de streaming, y que recibe las actualizaciones correctas, necesitas gestionar el servicio de streaming, la b\u00fasqueda, la cach\u00e9 y el almac\u00e9n de datos. Tambi\u00e9n necesitas integrar la cach\u00e9 con tu servicio CRUD (idealmente con los otros servicios, pero manteng\u00e1moslo simple). En resumen: hay mucho que hacer. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">Podemos limitar esas interacciones deshaci\u00e9ndonos de los servicios de streaming y asegur\u00e1ndonos de que otros servicios se actualizan manualmente. Esto es una licencia menos, algo que operar, algo que aprender, algo que integrar. A\u00fan no es lo ideal, pero podr\u00eda ser as\u00ed:<\/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;\">Es un poco m\u00e1s sencillo, s\u00f3lo 6 interacciones y 3 almacenes de datos en lugar de 8 y 4. Pero sigue habiendo muchas interacciones y parte de la integraci\u00f3n de streaming tiene que hacerse manualmente. Mientras que antes podr\u00edamos haber aprendido y utilizado los conectores existentes entre los servicios existentes. Echemos un vistazo r\u00e1pido al c\u00f3digo de ejemplo Java\/Spring Boot escrito para esto.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Existen 4 interfaces que representan lo que los desarrolladores pueden hacer con los almacenes de datos. CRUD, Cach\u00e9, Consulta y B\u00fasqueda.<\/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;\">No vamos a mostrar todo el c\u00f3digo en este post, sino s\u00f3lo algunas de las piezas interesantes. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">Estamos en una configuraci\u00f3n en la que el servicio CRUD tiene enlaces con los servicios Search y Cache. Veamos como quedar\u00eda con una versi\u00f3n simplificada. Tenemos que importar los servicios Cache y Search ya que son necesarios. A partir de ah\u00ed, todos los m\u00e9todos se ven afectados por ellos. Read necesita primero consultar la cach\u00e9, actualizar la \u00faltima vez que el objeto ha sido encontrado en la cach\u00e9 u obtenerlo de la base de datos e insertarlo en la cach\u00e9. A continuaci\u00f3n, los m\u00e9todos de creaci\u00f3n, actualizaci\u00f3n y eliminaci\u00f3n afectan a la cach\u00e9 y a la b\u00fasqueda, ya que los datos reci\u00e9n creados, actualizados o eliminados deben propagarse a la cach\u00e9 o a los \u00edndices del almac\u00e9n de datos de b\u00fasqueda.<\/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>Con Couchbase esto ser\u00eda m\u00e1s parecido a algo como esto:<\/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;\">La raz\u00f3n por la que no necesitamos una dependencia al servicio de Cach\u00e9 y B\u00fasqueda es porque Couchbase ya integra una cach\u00e9 y un motor de b\u00fasqueda. No hay necesidad de implementar la interfaz de Cache, y no hay necesidad de implementar el m\u00e9todo de borrado e indexado de la interfaz de b\u00fasqueda. Est\u00e1 todo automatizado e integrado.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Normalmente, cuando se lo explico a alguien, surge una conversaci\u00f3n sobre lo malo que debe ser, porque hay que hacer concesiones para poder hacer todas las cosas. No todas las plataformas de datos, multimodelo, multicarga de trabajo, o como quiera llam\u00e1rselas, se crean igual, o al menos no con la misma arquitectura en mente.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Couchbase puede verse como varias bases de datos diferentes, todas responsables de diferentes cargas de trabajo y todas integradas entre s\u00ed a trav\u00e9s de su servicio interno de streaming. De esta forma, cada parte de Couchbase se mantiene actualizada autom\u00e1ticamente y cada parte puede especializarse en su propia carga de trabajo de datos. Al final, tienes 3 interacciones y 1 almac\u00e9n de datos.<\/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;\">Esto ya es bastante bueno, pero tenemos una cosa m\u00e1s. Nuestros servicios est\u00e1n integrados en nuestro lenguaje de consulta SQL++. Tomemos un ejemplo. Usted tiene un CMS que contiene un \u00e1rbol de documentos, con varios permisos en cada documento, y esos permisos pueden ser heredados por los documentos hijos en los que desea ejecutar una b\u00fasqueda como un usuario conectado con un conjunto espec\u00edfico de permisos. Si est\u00e1 utilizando un motor de b\u00fasqueda externo, lo que suele suceder es:<\/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;\">Ejecutar una consulta al motor de b\u00fasqueda<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Recopilar los identificadores de los documentos devueltos, ya que no todo el contenido de los documentos est\u00e1 indexado.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Ejecutar una consulta para obtener los documentos completos<\/span>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"2\"><span style=\"font-weight: 400;\">Si su servicio de consulta no admite JOIN, ejecute otra consulta para obtener permisos heredados y filtrar los documentos.<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<p><span style=\"font-weight: 400;\">Si quisi\u00e9ramos complicar m\u00e1s las cosas (y quiz\u00e1 tambi\u00e9n hacerlas m\u00e1s reales) podr\u00edamos a\u00f1adir una l\u00f3gica de cach\u00e9 personalizada a cada paso. Pero ya es suficientemente complicado.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Couchbase puede hacerlo todo en un solo paso. En una consulta SQL++ podemos buscar, seleccionar los campos que queramos, y hacer JOIN en otros documentos para ordenar los permisos. As\u00ed de sencillo. Como Couchbase es una plataforma de datos bien integrada, su lenguaje de consulta te permite aprovechar todos sus poderes. Si te interesa, los detalles pueden venir en otro post.<\/span><\/p>\n<h2>Conclusi\u00f3n<\/h2>\n<p><span style=\"font-weight: 400;\">\u00bfQu\u00e9 hemos aprendido hoy? Utilizar una Plataforma de Datos bien dise\u00f1ada puede ahorrarte mucho tiempo, dinero, esfuerzo y quebraderos de cabeza. Porque, al final, tienes menos cosas en las que pensar, menos c\u00f3digo que escribir, lo que significa menos c\u00f3digo que mantener, y una capacidad m\u00e1s r\u00e1pida para enviar a producci\u00f3n. Por suerte, tambi\u00e9n simplifica y ahorra en aspectos como licencias, formaci\u00f3n, cumplimiento y todas esas cosas que preocupan a los gestores, analistas, su jefe y el jefe de su jefe.<\/span><\/p>\n<ul>\n<li>Vea mi charla con RedMonk: <a href=\"https:\/\/redmonk.com\/videos\/what-is-data-sprawl-how-to-leverage-a-platform-to-wrangle-it\/\">\u00bfQu\u00e9 es la dispersi\u00f3n de datos? C\u00f3mo aprovechar una plataforma para gestionarlos<\/a><\/li>\n<li>Echa un vistazo al c\u00f3digo de mi <a href=\"https:\/\/github.com\/ldoguin\/datasprawl-couchbase-redis-elastic-mongo\">ejemplo de dispersi\u00f3n de datos<\/a><\/li>\n<li>M\u00e1s informaci\u00f3n <a href=\"https:\/\/docs.couchbase.com\/server\/current\/learn\/services-and-indexes\/services\/services.html\">Servicios Couchbase<\/a> est\u00e1n dise\u00f1ados para que el desarrollo sea fluido y sencillo.<\/li>\n<li>Pruebe el <a href=\"https:\/\/www.couchbase.com\/blog\/es\/products\/capella\/\">Couchbase Capella DBaaS<\/a> para ponerlo a prueba<\/li>\n<\/ul>\n<p><iframe loading=\"lazy\" title=\"\u00bfQu\u00e9 es la dispersi\u00f3n de datos? C\u00f3mo aprovechar una plataforma para gestionarlos\" 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.8 (Yoast SEO v25.8) - 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\/es\/manage-data-sprawl-developers\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\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\/es\/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\":\"es\",\"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\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/manage-data-sprawl-developers\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@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\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@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\":\"es\",\"@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\/es\/author\/laurent-doguin\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Managing Data Sprawl for Developers - The Couchbase Blog","description":"Utilizar una Plataforma de Datos bien dise\u00f1ada puede ahorrarle mucho tiempo, dinero, esfuerzo y quebraderos de cabeza. Porque, al final, tienes menos c\u00f3digo que escribir y mantener.","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\/es\/manage-data-sprawl-developers\/","og_locale":"es_MX","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\/es\/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":"es","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":"Utilizar una Plataforma de Datos bien dise\u00f1ada puede ahorrarle mucho tiempo, dinero, esfuerzo y quebraderos de cabeza. Porque, al final, tienes menos c\u00f3digo que escribir y mantener.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/manage-data-sprawl-developers\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/manage-data-sprawl-developers\/"]}]},{"@type":"ImageObject","inLanguage":"es","@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":"El blog de Couchbase","description":"Couchbase, la base de datos 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":"es"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"El blog de Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"es","@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":"es","@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 es un metalero empoll\u00f3n que vive en Par\u00eds. Principalmente escribe c\u00f3digo en Java y texto estructurado en AsciiDoc, y a menudo habla sobre datos, programaci\u00f3n reactiva y otras cosas de moda. Tambi\u00e9n fue Developer Advocate de Clever Cloud y Nuxeo, donde dedic\u00f3 su tiempo y experiencia a ayudar a esas comunidades a crecer y fortalecerse. Ahora dirige las relaciones con los desarrolladores en 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\/es\/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","author_category":"","last_name":"Doguin","first_name":"Laurent","job_title":"","user_url":"","description":"Laurent es un metalero empoll\u00f3n que vive en Par\u00eds. Principalmente escribe c\u00f3digo en Java y texto estructurado en AsciiDoc, y a menudo habla sobre datos, programaci\u00f3n reactiva y otras cosas de moda. Tambi\u00e9n fue Developer Advocate de Clever Cloud y Nuxeo, donde dedic\u00f3 su tiempo y experiencia a ayudar a esas comunidades a crecer y fortalecerse. Ahora dirige las relaciones con los desarrolladores en Couchbase."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/14976","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/users\/49"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=14976"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/14976\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/14977"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=14976"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=14976"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=14976"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=14976"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}