{"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\/manage-data-sprawl-developers\/","title":{"rendered":"Managing Data Sprawl for Developers"},"content":{"rendered":"<p><span style=\"font-weight: 400;\">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 today I want to tell you about the reality of Data Sprawl for developers. How it impacts our work.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Data Sprawl can be summed up as we have data, a tremendous amount, stored in many different data stores. And on top of that, we as developers have to make those datastores interact with each other. And of course the more, the merrier, right \ud83d\ude2c?<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Usually it\u2019s associated with higher financial costs in:<\/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;\">Infrastructure<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Licenses<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Integration<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Training<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Operational<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Support costs<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">Separate platforms with multiple interfaces will give you headaches because of:<\/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;\">Independent deployment and management<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Different data model and programming interfaces<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Integration between multiple products<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Support tickets with different vendors<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">And we need to spend more time, efforts and cost because of:<\/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;\">License &amp; agreement<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Training for Developers and Operations<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Support\u00a0<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Build API or connector to database<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Purchase infrastructure<\/span><\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<p><span style=\"font-weight: 400;\">It is a little grim when you look at it like this but it is a day-to-day challenge for many companies. And not just with different data workloads, this is also true for the cloud applications.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Let\u2019s take a look at a specific example. I have created an application that uses CRUD from a document database, Cache from a caching store, and search from a fulltext search engine. (<a href=\"https:\/\/github.com\/ldoguin\/datasprawl-couchbase-redis-elastic-mongo\">GitHub source<\/a>)<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Taking a look at this schema you can basically count every arrow you see as one interaction between different systems that developers have to think about and code.<\/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;\">Here we are synchronizing automatically the Cache and Search databases using event streaming. That is 8 interactions and 4 data stores to learn and manage. Because you need to make sure that every store is plugged with the streaming service, and that it gets the right updates, you need to manage the streaming service, the search, cache and data store. You also need to integrate the cache with your CRUD service (ideally with the other services but let\u2019s keep that simple. In short: there is a lot to do. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">We can limit those interactions by getting rid of the streaming services and making sure other services are updated manually. This is one less license, thing to operate, thing to learn, thing to integrate. Still not ideal but it could look like this:<\/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;\">It\u2019s a bit simpler, only 6 interactions and 3 data stores instead of 8 and 4. But then there are still a lot of interactions and part of the streaming integration has to be done manually. Whereas, before we could have learned and used existing connectors between existing services. Let\u2019s take a quick look at the Java\/Spring Boot sample code written for this.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">There are 4 interfaces representing what developers can do with data stores. CRUD, Cache, Query and Search.<\/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;\">We are not going to show all the code in this post, but just a few of the interesting pieces. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">We are in a configuration where the CRUD service has links to the Search and Cache services. Let\u2019s see how it would look like with a simplified version. We have to import the Cache and Search service as they are required. From there, every method is impacted by it. Read needs to first query the cache, update the last time the object has been found in cache or get it from the database and insert it in the cache. Then Create, Update and Delete methods all impact Cache and Search as the newly created, updated or deleted data needs to be propagated to the Cache or the Search data store indexes.<\/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>With Couchbase this would be closer to something like this:<\/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;\">The reason we don\u2019t need a dependency to the Cache and Search service is because Couchbase already integrates a cache and a search engine. There is no need to implement the Cache interface, and no need to implement the delete and index method from the search interface. It\u2019s all automated and integrated.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Usually when I explain that to someone, a conversation follows about how bad it must be, because you have to make trade-offs to be able to do all the things. All Data Platforms, multi-model, multi-workload, however you want to talk about them, are not created equal, or at least not with the same architecture in mind.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Couchbase can be seen as several, different databases, all responsible for different workloads and all integrated together through its internal streaming service. This way every part of Couchbase is kept up to date automatically and every part can specialize in its own data workload. In the end, you get 3 interactions and 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;\">Now this is already quite nice, but we do have one more thing. Our services are integrated into our query language SQL++. Let\u2019s take an example. You have a CMS that holds a tree of documents, with various permissions on each document, and those permissions can be inherited by child documents on which you want to run a search as a connected user with a specific set of permissions. If you are using an external Search Engine, what usually happens is:<\/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;\">Run a search query to the search engine<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Gather the identifiers of the returned documents because not all the doc content is indexed<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Run a query to get the complete documents<\/span>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"2\"><span style=\"font-weight: 400;\">If your Query service does not support JOIN, run another query to get inherited permissions and filter out the docs<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<p><span style=\"font-weight: 400;\">If we wanted to make things more complicated (and maybe also more real) we could add a custom caching logic to each step. But it\u2019s already complicated enough.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Couchbase can do everything in one step. In one SQL++ query we can search, select the fields we want, and JOIN on other documents to sort out the permissions. It\u2019s as simple as that. Because Couchbase is a well integrated data platform, its query language allows you to leverage all of its powers. If you are interested, the details might come in another post.<\/span><\/p>\n<h2>Wrap up<\/h2>\n<p><span style=\"font-weight: 400;\">So what did we learn today? Using a well architected Data Platform can save you lots of time, money, effort and headache. Because, in the end, you have less things to think about, less code to write, which means less code to maintain, and a faster ability to ship to production. Thankfully, it also simplifies and saves on things like licenses, training, compliance and all those things that managers, analysts, your boss, your boss\u2019s boss care about!<\/span><\/p>\n<ul>\n<li>Watch my talk with RedMonk: <a href=\"https:\/\/redmonk.com\/videos\/what-is-data-sprawl-how-to-leverage-a-platform-to-wrangle-it\/\">What is Data Sprawl? How to Leverage a Platform to Wrangle it<\/a><\/li>\n<li>Check out the code for my <a href=\"https:\/\/github.com\/ldoguin\/datasprawl-couchbase-redis-elastic-mongo\">data sprawl example<\/a><\/li>\n<li>Learn more about how <a href=\"https:\/\/docs.couchbase.com\/server\/current\/learn\/services-and-indexes\/services\/services.html\">Couchbase services<\/a> are designed to make development smooth and simple.<\/li>\n<li>Try out the <a href=\"https:\/\/www.couchbase.com\/products\/capella\/\">Couchbase Capella DBaaS<\/a> to put it to the test<\/li>\n<\/ul>\n<p><iframe loading=\"lazy\" title=\"What is Data Sprawl? How to Leverage a Platform to Wrangle It\" 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>\n","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>\n","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\/manage-data-sprawl-developers\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\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\/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 minutes\" \/>\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\":\"en-US\",\"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\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/manage-data-sprawl-developers\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@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\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@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\":\"en-US\",\"@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\/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\/manage-data-sprawl-developers\/","og_locale":"en_US","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\/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 minutes"},"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":"en-US","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":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/manage-data-sprawl-developers\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@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":"en-US"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"The Couchbase Blog","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@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":"en-US","@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\/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 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."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts\/14976","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/users\/49"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/comments?post=14976"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts\/14976\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/media\/14977"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/media?parent=14976"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/categories?post=14976"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/tags?post=14976"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/ppma_author?post=14976"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}