[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"site:languages:id":3,"site:settings:id":22,"site:navigation:id":43,"blog:categories:id":169,"blog:list:id":215},[4,13],{"id":5,"code":6,"name":7,"nativeName":7,"direction":8,"flagEmoji":9,"isDefault":10,"isActive":10,"sortOrder":11,"createdAt":12,"updatedAt":12},"cms5x82ws0000p90jaubd6xdp","en","English","LTR","🇬🇧",true,0,"2026-07-29T10:07:30.747Z",{"id":14,"code":15,"name":16,"nativeName":17,"direction":8,"flagEmoji":18,"isDefault":19,"isActive":10,"sortOrder":20,"createdAt":21,"updatedAt":21},"cms5x82x90001p90je35iy8zx","id","Indonesian","Bahasa Indonesia","🇮🇩",false,1,"2026-07-29T10:07:30.766Z",{"site.name":23,"site.shortName":24,"site.logo_dark":25,"site.logo_light":26,"site.url":27,"site.defaultLocale":6,"contact.email":28,"contact.sales_email":29,"contact.phone":30,"contact.whatsapp":31,"contact.address":32,"contact.map_embed_url":33,"contact.office_hours":34,"company.legal_name":23,"company.founded":35,"seo.default_title":36,"seo.default_description":37,"seo.twitter_handle":38,"seo.default_og_image":39,"social.links":40,"features.newsletter_enabled":41,"features.blog_enabled":41,"features.careers_enabled":41,"integrations.google_analytics_id":42,"integrations.recaptcha_site_key":42},"PT Moodkuit Solutions Technologies","Moodkuit","\u002Fimages\u002Flogo\u002Fblack-logo.png","\u002Fimages\u002Flogo\u002Fwhite-logo.png","https:\u002F\u002Fmoodkuit.com","hello@moodkuit.com","sales@moodkuit.com","+62 21 5010 8899","+62 812 1000 8899","Menara Kuningan, 12th Floor, Jl. H. R. Rasuna Said, Jakarta Selatan 12940, Indonesia","https:\u002F\u002Fmaps.google.com\u002F?q=-6.2238,106.8317","Mon–Fri, 09:00–18:00 WIB","2018","Moodkuit — Enterprise Software House","Moodkuit designs, builds and operates enterprise software platforms — custom systems, web, mobile, cloud and data.","@moodkuit","\u002Fimages\u002Fhero\u002Fhero-slider.jpg","[{\"platform\":\"linkedin\",\"url\":\"https:\u002F\u002Flinkedin.com\u002Fcompany\u002Fmoodkuit\"},{\"platform\":\"github\",\"url\":\"https:\u002F\u002Fgithub.com\u002Fmoodkuit\"},{\"platform\":\"x\",\"url\":\"https:\u002F\u002Fx.com\u002Fmoodkuit\"},{\"platform\":\"instagram\",\"url\":\"https:\u002F\u002Finstagram.com\u002Fmoodkuit\"}]","true","",{"HEADER":44,"FOOTER_PRIMARY":93,"FOOTER_SECONDARY":106,"LEGAL":127,"SOCIAL":143},[45,52,57,63,69,75,81,87],{"id":46,"href":47,"target":48,"icon":49,"sortOrder":11,"label":50,"caption":49,"children":51},"cms5x85l800nvp90jgvd1p33h","\u002F","_self",null,"Beranda",[],{"id":53,"href":54,"target":48,"icon":49,"sortOrder":20,"label":55,"caption":49,"children":56},"cms5x85lq00o1p90j6pq2ixue","\u002Fabout","Tentang",[],{"id":58,"href":59,"target":48,"icon":49,"sortOrder":60,"label":61,"caption":49,"children":62},"cms5x85m700o7p90jfrpuma9c","\u002Fservices",2,"Layanan",[],{"id":64,"href":65,"target":48,"icon":49,"sortOrder":66,"label":67,"caption":49,"children":68},"cms5x85ml00odp90jhbidzcte","\u002Fportfolio",3,"Portofolio",[],{"id":70,"href":71,"target":48,"icon":49,"sortOrder":72,"label":73,"caption":49,"children":74},"cms5x85mw00ojp90jm01w80sb","\u002Fcase-studies",4,"Studi Kasus",[],{"id":76,"href":77,"target":48,"icon":49,"sortOrder":78,"label":79,"caption":49,"children":80},"cms5x85n700opp90j8c67qr9t","\u002Fblog",5,"Blog",[],{"id":82,"href":83,"target":48,"icon":49,"sortOrder":84,"label":85,"caption":49,"children":86},"cms5x85nk00ovp90jzoeadygb","\u002Fcareers",6,"Karier",[],{"id":88,"href":89,"target":48,"icon":49,"sortOrder":90,"label":91,"caption":49,"children":92},"cms5x85nu00p1p90jb67ikv77","\u002Fcontact",7,"Kontak",[],[94,97,100,103],{"id":95,"href":54,"target":48,"icon":49,"sortOrder":11,"label":55,"caption":49,"children":96},"cms5x85od00p8p90j616esl9i",[],{"id":98,"href":83,"target":48,"icon":49,"sortOrder":20,"label":85,"caption":49,"children":99},"cms5x85ot00pep90jrto5fvh7",[],{"id":101,"href":71,"target":48,"icon":49,"sortOrder":60,"label":73,"caption":49,"children":102},"cms5x85p400pkp90jd8usqva3",[],{"id":104,"href":89,"target":48,"icon":49,"sortOrder":66,"label":91,"caption":49,"children":105},"cms5x85pg00pqp90jvlmbrz8q",[],[107,112,117,122],{"id":108,"href":109,"target":48,"icon":49,"sortOrder":11,"label":110,"caption":49,"children":111},"cms5x85q100pxp90juyka7vco","\u002Fservices\u002Fcustom-software-development","Perangkat Lunak Khusus",[],{"id":113,"href":114,"target":48,"icon":49,"sortOrder":20,"label":115,"caption":49,"children":116},"cms5x85qj00q3p90jdh85gytx","\u002Fservices\u002Fweb-platform-engineering","Platform Web",[],{"id":118,"href":119,"target":48,"icon":49,"sortOrder":60,"label":120,"caption":49,"children":121},"cms5x85r400q9p90jdhsjcffv","\u002Fservices\u002Fmobile-application-development","Aplikasi Mobile",[],{"id":123,"href":124,"target":48,"icon":49,"sortOrder":66,"label":125,"caption":49,"children":126},"cms5x85rw00qfp90j1rs0xc9k","\u002Fservices\u002Fcloud-devops","Cloud & DevOps",[],[128,133,138],{"id":129,"href":130,"target":48,"icon":49,"sortOrder":11,"label":131,"caption":49,"children":132},"cms5x85sm00qmp90jki97thzi","\u002Fprivacy","Kebijakan Privasi",[],{"id":134,"href":135,"target":48,"icon":49,"sortOrder":20,"label":136,"caption":49,"children":137},"cms5x85sw00qsp90j96hsi9if","\u002Fterms","Syarat & Ketentuan",[],{"id":139,"href":140,"target":48,"icon":49,"sortOrder":60,"label":141,"caption":49,"children":142},"cms5x85ta00qyp90je9qxvdrq","\u002Ffaq","FAQ",[],[144,151,157,163],{"id":145,"href":146,"target":147,"icon":148,"sortOrder":11,"label":149,"caption":49,"children":150},"cms5x85to00r5p90jlpp2dj9y","https:\u002F\u002Flinkedin.com\u002Fcompany\u002Fmoodkuit","_blank","linkedin","LinkedIn",[],{"id":152,"href":153,"target":147,"icon":154,"sortOrder":20,"label":155,"caption":49,"children":156},"cms5x85u000rbp90jz220we6w","https:\u002F\u002Fgithub.com\u002Fmoodkuit","github","GitHub",[],{"id":158,"href":159,"target":147,"icon":160,"sortOrder":60,"label":161,"caption":49,"children":162},"cms5x85uc00rhp90j909vvybj","https:\u002F\u002Fx.com\u002Fmoodkuit","x","X",[],{"id":164,"href":165,"target":147,"icon":166,"sortOrder":66,"label":167,"caption":49,"children":168},"cms5x85un00rnp90j4c6x21gw","https:\u002F\u002Finstagram.com\u002Fmoodkuit","instagram","Instagram",[],[170,185,200],{"id":171,"parentId":49,"sortOrder":11,"createdAt":172,"updatedAt":172,"deletedAt":49,"translations":173,"_count":184},"cms5x84dx00a0p90jq4hj1xcq","2026-07-29T10:07:32.661Z",[174,179],{"id":175,"categoryId":171,"locale":6,"name":176,"slug":177,"description":49,"seoTitle":49,"seoDescription":49,"createdAt":178,"updatedAt":178},"cms5x84e300a2p90jrmk5oan0","Engineering","engineering","2026-07-29T10:07:32.667Z",{"id":180,"categoryId":171,"locale":15,"name":181,"slug":182,"description":49,"seoTitle":49,"seoDescription":49,"createdAt":183,"updatedAt":183},"cms5x84e900a4p90jp567w33d","Rekayasa","rekayasa","2026-07-29T10:07:32.674Z",{"posts":66},{"id":186,"parentId":49,"sortOrder":20,"createdAt":187,"updatedAt":187,"deletedAt":49,"translations":188,"_count":199},"cms5x84eh00a5p90jy18t0toq","2026-07-29T10:07:32.681Z",[189,194],{"id":190,"categoryId":186,"locale":6,"name":191,"slug":192,"description":49,"seoTitle":49,"seoDescription":49,"createdAt":193,"updatedAt":193},"cms5x84ek00a7p90jtwmn33gk","Product","product","2026-07-29T10:07:32.685Z",{"id":195,"categoryId":186,"locale":15,"name":196,"slug":197,"description":49,"seoTitle":49,"seoDescription":49,"createdAt":198,"updatedAt":198},"cms5x84er00a9p90jkb1sr9kr","Produk","produk","2026-07-29T10:07:32.689Z",{"posts":20},{"id":201,"parentId":49,"sortOrder":60,"createdAt":202,"updatedAt":202,"deletedAt":49,"translations":203,"_count":214},"cms5x84ey00aap90jb6oji1s9","2026-07-29T10:07:32.698Z",[204,209],{"id":205,"categoryId":201,"locale":6,"name":206,"slug":207,"description":49,"seoTitle":49,"seoDescription":49,"createdAt":208,"updatedAt":208},"cms5x84f100acp90j2y6m0s42","Company","company","2026-07-29T10:07:32.701Z",{"id":210,"categoryId":201,"locale":15,"name":211,"slug":212,"description":49,"seoTitle":49,"seoDescription":49,"createdAt":213,"updatedAt":213},"cms5x84f600aep90jj3uqmqhi","Perusahaan","perusahaan","2026-07-29T10:07:32.706Z",{"posts":20},{"data":216,"meta":377},[217,257,289,318,348],{"id":218,"authorId":219,"coverImageId":220,"status":221,"publishedAt":222,"readingMinutes":78,"viewCount":223,"isFeatured":19,"allowComments":19,"createdAt":224,"updatedAt":225,"deletedAt":49,"coverImage":226,"author":240,"categories":243,"translation":249},"cms5x84ll00btp90joerbi9uc","cms5x83ok0035p90j1tmyvb7d","cms5x83yp0061p90jub9op0dm","PUBLISHED","2026-06-18T09:00:00.000Z",12,"2026-07-29T10:07:32.937Z","2026-07-29T12:34:49.726Z",{"id":220,"folderId":227,"uploadedById":228,"type":229,"filename":230,"originalName":230,"mimeType":231,"size":232,"width":233,"height":234,"storageKey":235,"url":236,"thumbnailUrl":236,"alt":237,"caption":49,"blurhash":49,"createdAt":238,"updatedAt":239,"deletedAt":49},"cms5x83pu003jp90j5lwg5qs2","cms5x83o00034p90jw5cmslod","IMAGE","post-5.jpg","image\u002Fjpeg",19429,356,240,"seed\u002Fpost\u002Fmoodkuit-opens-its-jakarta-engineering-studio\u002Fpost-5.jpg","https:\u002F\u002Fcdn.moodkuit.com\u002Fmoodkuit\u002Fseed\u002Fpost\u002Fmoodkuit-opens-its-jakarta-engineering-studio\u002Fpost-5.jpg","The Moodkuit engineering studio in South Jakarta","2026-07-29T10:07:32.113Z","2026-07-29T10:31:55.642Z",{"id":219,"name":241,"avatarUrl":242},"Rani Prameswari","\u002Fimages\u002Fnews\u002Fauthor_img2.jpg",[244],{"postId":218,"categoryId":201,"category":245},{"id":201,"parentId":49,"sortOrder":60,"createdAt":202,"updatedAt":202,"deletedAt":49,"translations":246},[247,248],{"id":205,"categoryId":201,"locale":6,"name":206,"slug":207,"description":49,"seoTitle":49,"seoDescription":49,"createdAt":208,"updatedAt":208},{"id":210,"categoryId":201,"locale":15,"name":211,"slug":212,"description":49,"seoTitle":49,"seoDescription":49,"createdAt":213,"updatedAt":213},{"id":250,"postId":218,"locale":15,"title":251,"slug":252,"excerpt":253,"content":254,"seoTitle":255,"seoDescription":253,"seoKeywords":49,"canonicalUrl":49,"ogImageUrl":49,"noIndex":19,"noFollow":19,"createdAt":256,"updatedAt":256},"cms5x84lu00bxp90jgc6n38bt","Moodkuit membuka studio rekayasa di Jakarta","moodkuit-membuka-studio-rekayasa-di-jakarta","Ruang khusus untuk pairing, tinjauan arsitektur, dan sesi discovery bersama klien.","\u003Cp>Studio baru kami di Jakarta Selatan memberi tim pengiriman rumah tetap untuk lokakarya discovery dan tinjauan arsitektur, dengan klien diundang langsung ke ruangan, bukan sekadar laporan status.\u003C\u002Fp>","Moodkuit membuka studio rekayasa di Jakarta | Moodkuit","2026-07-29T10:07:32.946Z",{"id":258,"authorId":219,"coverImageId":259,"status":221,"publishedAt":260,"readingMinutes":72,"viewCount":261,"isFeatured":19,"allowComments":19,"createdAt":262,"updatedAt":263,"deletedAt":49,"coverImage":264,"author":274,"categories":275,"translation":281},"cms5x84kj00bnp90j5qo7aas1","cms5x83yk005zp90jsek60xg4","2026-06-10T09:00:00.000Z",14,"2026-07-29T10:07:32.899Z","2026-07-29T12:36:45.498Z",{"id":259,"folderId":227,"uploadedById":228,"type":229,"filename":265,"originalName":265,"mimeType":231,"size":266,"width":267,"height":268,"storageKey":269,"url":270,"thumbnailUrl":270,"alt":271,"caption":49,"blurhash":49,"createdAt":272,"updatedAt":273,"deletedAt":49},"post-4.jpg",36028,850,402,"seed\u002Fpost\u002Fcore-web-vitals-budgets-that-survive-the-second-sprint\u002Fpost-4.jpg","https:\u002F\u002Fcdn.moodkuit.com\u002Fmoodkuit\u002Fseed\u002Fpost\u002Fcore-web-vitals-budgets-that-survive-the-second-sprint\u002Fpost-4.jpg","Performance budget failing a continuous integration run","2026-07-29T10:07:32.108Z","2026-07-29T10:31:55.623Z",{"id":219,"name":241,"avatarUrl":242},[276],{"postId":258,"categoryId":171,"category":277},{"id":171,"parentId":49,"sortOrder":11,"createdAt":172,"updatedAt":172,"deletedAt":49,"translations":278},[279,280],{"id":175,"categoryId":171,"locale":6,"name":176,"slug":177,"description":49,"seoTitle":49,"seoDescription":49,"createdAt":178,"updatedAt":178},{"id":180,"categoryId":171,"locale":15,"name":181,"slug":182,"description":49,"seoTitle":49,"seoDescription":49,"createdAt":183,"updatedAt":183},{"id":282,"postId":258,"locale":15,"title":283,"slug":284,"excerpt":285,"content":286,"seoTitle":287,"seoDescription":285,"seoKeywords":49,"canonicalUrl":49,"ogImageUrl":49,"noIndex":19,"noFollow":19,"createdAt":288,"updatedAt":288},"cms5x84kr00brp90jge79ik4t","Anggaran Core Web Vitals yang bertahan sampai sprint kedua","anggaran-core-web-vitals-yang-bertahan-sampai-sprint-kedua","Skor Lighthouse saat rilis hanyalah potret. Anggaran di CI adalah jaminan.","\u003Cp>Regresi performa datang satu impor sepele setiap kali. Perbaikannya bersifat struktural: anggaran ditegakkan di CI, dan build gagal saat LCP atau ukuran bundel melewati batas.\u003C\u002Fp>","Anggaran Core Web Vitals yang bertahan sampai sprint kedua | Moodkuit","2026-07-29T10:07:32.907Z",{"id":290,"authorId":219,"coverImageId":291,"status":221,"publishedAt":292,"readingMinutes":84,"viewCount":223,"isFeatured":19,"allowComments":19,"createdAt":293,"updatedAt":294,"deletedAt":49,"coverImage":295,"author":303,"categories":304,"translation":310},"cms5x84jx00bhp90ja6t3v8st","cms5x83ye005xp90jvw3zr4ne","2026-06-02T09:00:00.000Z","2026-07-29T10:07:32.877Z","2026-07-29T12:34:54.197Z",{"id":291,"folderId":227,"uploadedById":228,"type":229,"filename":296,"originalName":296,"mimeType":231,"size":297,"width":267,"height":268,"storageKey":298,"url":299,"thumbnailUrl":299,"alt":300,"caption":49,"blurhash":49,"createdAt":301,"updatedAt":302,"deletedAt":49},"post-3.jpg",24710,"seed\u002Fpost\u002Fthe-audit-log-is-a-feature-not-a-debugging-tool\u002Fpost-3.jpg","https:\u002F\u002Fcdn.moodkuit.com\u002Fmoodkuit\u002Fseed\u002Fpost\u002Fthe-audit-log-is-a-feature-not-a-debugging-tool\u002Fpost-3.jpg","Audit trail entries reviewed in an admin interface","2026-07-29T10:07:32.102Z","2026-07-29T10:31:55.674Z",{"id":219,"name":241,"avatarUrl":242},[305],{"postId":290,"categoryId":186,"category":306},{"id":186,"parentId":49,"sortOrder":20,"createdAt":187,"updatedAt":187,"deletedAt":49,"translations":307},[308,309],{"id":190,"categoryId":186,"locale":6,"name":191,"slug":192,"description":49,"seoTitle":49,"seoDescription":49,"createdAt":193,"updatedAt":193},{"id":195,"categoryId":186,"locale":15,"name":196,"slug":197,"description":49,"seoTitle":49,"seoDescription":49,"createdAt":198,"updatedAt":198},{"id":311,"postId":290,"locale":15,"title":312,"slug":313,"excerpt":314,"content":315,"seoTitle":316,"seoDescription":314,"seoKeywords":49,"canonicalUrl":49,"ogImageUrl":49,"noIndex":19,"noFollow":19,"createdAt":317,"updatedAt":317},"cms5x84k500blp90jumxsp7v1","Log audit adalah fitur, bukan alat debugging","log-audit-adalah-fitur-bukan-alat-debugging","Jika CMS Anda tidak bisa menjawab \"siapa mengubah ini dan kapan\", itu belum perangkat lunak enterprise.","\u003Cp>Log audit yang ditambahkan terlambat menjadi tulisan ad-hoc yang berserakan. Ditambahkan sejak awal sebagai interceptor di batas mutasi, biayanya hampir nol dan cakupannya menyeluruh.\u003C\u002Fp>\u003Ch2>Apa yang dicatat\u003C\u002Fh2>\u003Cp>Aktor, aksi, entitas, id entitas, diff before\u002Fafter yang disunting, request id, IP, dan user agent. Rahasia dan hash kata sandi dihapus sebelum baris ditulis.\u003C\u002Fp>","Log audit adalah fitur, bukan alat debugging | Moodkuit","2026-07-29T10:07:32.885Z",{"id":319,"authorId":219,"coverImageId":320,"status":221,"publishedAt":321,"readingMinutes":78,"viewCount":322,"isFeatured":19,"allowComments":19,"createdAt":323,"updatedAt":324,"deletedAt":49,"coverImage":325,"author":333,"categories":334,"translation":340},"cms5x84j900bbp90jgvsq13h5","cms5x83y9005vp90j0shkjq4a","2026-05-25T09:00:00.000Z",8,"2026-07-29T10:07:32.853Z","2026-07-29T12:16:56.902Z",{"id":320,"folderId":227,"uploadedById":228,"type":229,"filename":326,"originalName":326,"mimeType":231,"size":327,"width":267,"height":268,"storageKey":328,"url":329,"thumbnailUrl":329,"alt":330,"caption":49,"blurhash":49,"createdAt":331,"updatedAt":332,"deletedAt":49},"post-2.jpg",30668,"seed\u002Fpost\u002Fshipping-a-multilingual-site-without-duplicating-your-codebase\u002Fpost-2.jpg","https:\u002F\u002Fcdn.moodkuit.com\u002Fmoodkuit\u002Fseed\u002Fpost\u002Fshipping-a-multilingual-site-without-duplicating-your-codebase\u002Fpost-2.jpg","Locale-prefixed routes mapped out on a whiteboard","2026-07-29T10:07:32.097Z","2026-07-29T10:31:55.658Z",{"id":219,"name":241,"avatarUrl":242},[335],{"postId":319,"categoryId":171,"category":336},{"id":171,"parentId":49,"sortOrder":11,"createdAt":172,"updatedAt":172,"deletedAt":49,"translations":337},[338,339],{"id":175,"categoryId":171,"locale":6,"name":176,"slug":177,"description":49,"seoTitle":49,"seoDescription":49,"createdAt":178,"updatedAt":178},{"id":180,"categoryId":171,"locale":15,"name":181,"slug":182,"description":49,"seoTitle":49,"seoDescription":49,"createdAt":183,"updatedAt":183},{"id":341,"postId":319,"locale":15,"title":342,"slug":343,"excerpt":344,"content":345,"seoTitle":346,"seoDescription":344,"seoKeywords":49,"canonicalUrl":49,"ogImageUrl":49,"noIndex":19,"noFollow":19,"createdAt":347,"updatedAt":347},"cms5x84jh00bfp90jcufpo2op","Merilis situs multibahasa tanpa menggandakan basis kode","merilis-situs-multibahasa-tanpa-menggandakan-basis-kode","Routing berprefiks locale, hreflang, URL canonical, dan slug per locale — ditangani sekali di router.","\u003Cp>Sebagian besar situs multibahasa keliru di tempat yang sama: URL. Begitu slug berbeda per locale, routing naif memaksa halaman ganda atau URL berbahasa Inggris di mana-mana.\u003C\u002Fp>\u003Ch2>Kontrak routing\u003C\u002Fh2>\u003Cp>Locale default disajikan tanpa prefiks. Locale lain diberi prefiks. Slug diselesaikan per locale dari basis data, dan setiap halaman memancarkan set lengkap \u003Ccode>hreflang\u003C\u002Fcode> beserta \u003Ccode>x-default\u003C\u002Fcode>.\u003C\u002Fp>","Merilis situs multibahasa tanpa menggandakan basis kode | Moodkuit","2026-07-29T10:07:32.861Z",{"id":349,"authorId":219,"coverImageId":350,"status":221,"publishedAt":351,"readingMinutes":72,"viewCount":322,"isFeatured":10,"allowComments":19,"createdAt":352,"updatedAt":353,"deletedAt":49,"coverImage":354,"author":362,"categories":363,"translation":369},"cms5x84i100b5p90j5aybdulu","cms5x83y2005tp90jglrwh85p","2026-05-17T09:00:00.000Z","2026-07-29T10:07:32.810Z","2026-07-29T12:17:05.948Z",{"id":350,"folderId":227,"uploadedById":228,"type":229,"filename":355,"originalName":355,"mimeType":231,"size":356,"width":267,"height":268,"storageKey":357,"url":358,"thumbnailUrl":358,"alt":359,"caption":49,"blurhash":49,"createdAt":360,"updatedAt":361,"deletedAt":49},"post-1.jpg",52352,"seed\u002Fpost\u002Fwhy-we-model-translations-as-rows-not-json\u002Fpost-1.jpg","https:\u002F\u002Fcdn.moodkuit.com\u002Fmoodkuit\u002Fseed\u002Fpost\u002Fwhy-we-model-translations-as-rows-not-json\u002Fpost-1.jpg","Database schema sketch comparing JSON blobs with translation tables","2026-07-29T10:07:32.090Z","2026-07-29T10:31:55.693Z",{"id":219,"name":241,"avatarUrl":242},[364],{"postId":349,"categoryId":171,"category":365},{"id":171,"parentId":49,"sortOrder":11,"createdAt":172,"updatedAt":172,"deletedAt":49,"translations":366},[367,368],{"id":175,"categoryId":171,"locale":6,"name":176,"slug":177,"description":49,"seoTitle":49,"seoDescription":49,"createdAt":178,"updatedAt":178},{"id":180,"categoryId":171,"locale":15,"name":181,"slug":182,"description":49,"seoTitle":49,"seoDescription":49,"createdAt":183,"updatedAt":183},{"id":370,"postId":349,"locale":15,"title":371,"slug":372,"excerpt":373,"content":374,"seoTitle":375,"seoDescription":373,"seoKeywords":49,"canonicalUrl":49,"ogImageUrl":49,"noIndex":19,"noFollow":19,"createdAt":376,"updatedAt":376},"cms5x84ik00b9p90jmkopb6ke","Mengapa kami memodelkan terjemahan sebagai baris, bukan JSON","mengapa-kami-memodelkan-terjemahan-sebagai-baris-bukan-json","Blob terjemahan JSON terasa praktis sampai Anda perlu menemukan setiap judul yang belum diterjemahkan. Tabel terjemahan relasional hanya menambah satu join dan menjawabnya dalam milidetik.","\u003Cp>Menyimpan terjemahan dalam kolom JSON tampak pragmatis. Satu kolom, tanpa join, tanpa migrasi saat menambah locale. Tagihannya datang belakangan.\u003C\u002Fp>\u003Ch2>Yang rusak\u003C\u002Fh2>\u003Cp>Pelaporan cakupan terjemahan menjadi pemindaian tabel penuh dengan ekspresi JSON path. Keunikan slug per locale tidak dapat ditegakkan basis data. Indeks parsial untuk konten terpublikasi per locale tidak tersedia.\u003C\u002Fp>\u003Ch2>Yang kami lakukan\u003C\u002Fh2>\u003Cp>Setiap entitas yang dapat diterjemahkan memiliki tabel pendamping dengan kunci \u003Ccode>(entity_id, locale)\u003C\u002Fcode> dan batasan unik kedua pada \u003Ccode>(locale, slug)\u003C\u002Fcode>. Menambah bahasa Jepang cukup satu insert ke tabel \u003Ccode>languages\u003C\u002Fcode>.\u003C\u002Fp>","Mengapa kami memodelkan terjemahan sebagai baris, bukan JSON | Moodkuit","2026-07-29T10:07:32.828Z",{"page":20,"limit":378,"total":78,"totalPages":20,"hasNextPage":19,"hasPreviousPage":19},9]