[{"data":1,"prerenderedAt":115},["ShallowReactive",2],{"i-lucide:menu":3,"i-lucide:arrow-up-right":8,"i-lucide:moon":10,"i-lucide:sun":12,"i-lucide:rss":14,"i-simple-icons:github":16,"i-simple-icons:linkedin":18,"post-\u002F2012\u002Ftackling-the-problem-of-a-shared-database":21,"surround-\u002F2012\u002Ftackling-the-problem-of-a-shared-database":102,"i-lucide:arrow-left":111,"i-lucide:arrow-right":113},{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":7},0,24,false,"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M4 5h16M4 12h16M4 19h16\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":9},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M7 7h10v10M7 17L17 7\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":11},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":13},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"4\"\u002F>\u003Cpath d=\"M12 2v2m0 16v2M4.93 4.93l1.41 1.41m11.32 11.32l1.41 1.41M2 12h2m16 0h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":15},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M4 11a9 9 0 0 1 9 9M4 4a16 16 0 0 1 16 16\"\u002F>\u003Ccircle cx=\"5\" cy=\"19\" r=\"1\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":17},"\u003Cpath fill=\"currentColor\" d=\"M12 .297c-6.63 0-12 5.373-12 12c0 5.303 3.438 9.8 8.205 11.385c.6.113.82-.258.82-.577c0-.285-.01-1.04-.015-2.04c-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729c1.205.084 1.838 1.236 1.838 1.236c1.07 1.835 2.809 1.305 3.495.998c.108-.776.417-1.305.76-1.605c-2.665-.3-5.466-1.332-5.466-5.93c0-1.31.465-2.38 1.235-3.22c-.135-.303-.54-1.523.105-3.176c0 0 1.005-.322 3.3 1.23c.96-.267 1.98-.399 3-.405c1.02.006 2.04.138 3 .405c2.28-1.552 3.285-1.23 3.285-1.23c.645 1.653.24 2.873.12 3.176c.765.84 1.23 1.91 1.23 3.22c0 4.61-2.805 5.625-5.475 5.92c.42.36.81 1.096.81 2.22c0 1.606-.015 2.896-.015 3.286c0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":19,"hidden":20},"\u003Cpath fill=\"currentColor\" d=\"M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037c-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85c3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.06 2.06 0 0 1-2.063-2.065a2.064 2.064 0 1 1 2.063 2.065m1.782 13.019H3.555V9h3.564zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0z\"\u002F>",true,{"id":22,"title":23,"body":24,"category":85,"comments":86,"date":87,"description":30,"excerpt":86,"extension":88,"image":86,"meta":89,"navigation":20,"path":90,"readingTime":91,"seo":92,"stem":93,"subtitle":86,"tags":94,"wordCount":100,"__hash__":101},"posts\u002F2012\u002Ftackling-the-problem-of-a-shared-database.md","Tackling the problem of a shared database",{"type":25,"value":26,"toc":78},"minimark",[27,31,36,39,42,46,49,52,55,59,62,65,75],[28,29,30],"p",{},"The following is a description of a database design problem I'm currently trying to solve.",[32,33,35],"h2",{"id":34},"background","Background",[28,37,38],{},"We (my company) have several small web apps, all made for the same client, all using some portion of shared data (data that's the same within the context of the client's business). So each app has it's own Employees table, Objects table, Prices table... and in most cases the data is identical.",[28,40,41],{},"The problem is that if a new employee is hired by the client all web apps need manual data update and that's costly in terms of human resources.",[32,43,45],{"id":44},"the-solution","The solution",[28,47,48],{},"Use a central database, \"guarded\" by a web service for authentication, authorization, logging.",[28,50,51],{},"Each smaller app would then still have it's own employee, objects, prices table, but they would hold only values that are specific for that app and can not be put into the central database. The tables would also hold a reference (PK) for the corresponding row in the central database.",[28,53,54],{},"The smaller apps would then make a query to the web service each time they need data about some shared row.\nCRUD operations would go through the web service.",[32,56,58],{"id":57},"the-problem","The problem",[28,60,61],{},"Is this really how it's done? How could one do that better?\nAnother problem is with queries: now it's impossible to put any shared columns to a single SQL statement (WHERE x=y)",[28,63,64],{},"Alternatives I've considered:",[66,67,68,72],"ul",{},[69,70,71],"li",{},"Hold a full copy of this shared data in each of the smaller apps, but sync any changes to the central database (and other apps). Also sync changes from the central database. What if sync is interrupted? = inconsistent data",[69,73,74],{},"Put ALL the shared data to the central database. Would not work for relational databases.",[28,76,77],{},"Any references to articles, blog posts discussing this are appreciated.",{"title":79,"searchDepth":80,"depth":80,"links":81},"",2,[82,83,84],{"id":34,"depth":80,"text":35},{"id":44,"depth":80,"text":45},{"id":57,"depth":80,"text":58},"Software Development",null,"2012-05-28","md",{},"\u002F2012\u002Ftackling-the-problem-of-a-shared-database","about 1 minute",{"title":23,"description":30},"2012\u002Ftackling-the-problem-of-a-shared-database",[95,96,97,98,99],"api","database","database design","web service","shared database",297,"OMxBDoeUYf6ARxzeLEK6xeaKDFY9KR6UBx088eiiGqQ",[103,107],{"title":104,"path":105,"stem":106,"children":-1},"Easily guessable URI-s: not a good idea","\u002F2012\u002Feasily-guessable-uri-s-not-a-good-idea","2012\u002Feasily-guessable-uri-s-not-a-good-idea",{"title":108,"path":109,"stem":110,"children":-1},"Designing a database for multiple clients","\u002F2012\u002Fdesigning-a-database-for-multiple-clients","2012\u002Fdesigning-a-database-for-multiple-clients",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":112},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"m12 19l-7-7l7-7m7 7H5\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":114},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 12h14m-7-7l7 7l-7 7\"\u002F>",1790886934174]