[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-deep-evm-26-tajzia-muqabil-taqsim-bunya-jadawil-dakhma":3},{"article":4,"author":59},{"id":5,"category_id":6,"title":7,"slug":8,"excerpt":9,"content_md":10,"content_html":11,"locale":12,"author_id":13,"published":14,"published_at":15,"meta_title":16,"meta_description":17,"focus_keyword":18,"og_image":19,"canonical_url":19,"robots_meta":20,"created_at":15,"updated_at":15,"tags":21,"category_name":24,"related_articles":39},"d9000000-0000-0000-0000-000000000126","a0000000-0000-0000-0000-000000000095","Deep EVM #26: التجزئة مقابل التقسيم — بنية الجداول الضخمة","deep-evm-26-tajzia-muqabil-taqsim-bunya-jadawil-dakhma","متى تستخدم التجزئة (Sharding) ومتى يكفي التقسيم (Partitioning): المقارنة والاختيار والتنفيذ لأحجام بيانات ضخمة.","## التقسيم مقابل التجزئة\n\n- **التقسيم** — تقسيم جدول واحد إلى أجزاء داخل نفس قاعدة البيانات\n- **التجزئة** — توزيع البيانات عبر عدة خوادم قاعدة بيانات\n\n## متى يكفي التقسيم\n\nالتقسيم يكفي عندما:\n- البيانات تتسع في خادم واحد\n- الاستعلامات تستهدف قسماً واحداً عادةً\n- لا تحتاج توسعاً أفقياً للكتابة\n\n## متى تحتاج التجزئة\n\nالتجزئة ضرورية عندما:\n- حجم البيانات يتجاوز سعة خادم واحد\n- حمل الكتابة يتجاوز قدرة خادم واحد\n- تحتاج عزلاً جغرافياً للبيانات\n\n## استراتيجيات مفتاح التجزئة\n\n```rust\n\u002F\u002F تجزئة بالتجزئة\nfn get_shard(user_id: Uuid, num_shards: usize) -> usize {\n    let hash = xxhash(&user_id.as_bytes());\n    hash as usize % num_shards\n}\n\n\u002F\u002F تجزئة بالنطاق\nfn get_shard_by_date(created_at: DateTime, shards: &[ShardConfig]) -> &ShardConfig {\n    shards.iter().find(|s| s.date_range.contains(&created_at)).unwrap()\n}\n```\n\n## التجزئة مع Rust\n\n```rust\nstruct ShardedPool {\n    pools: Vec\u003CPgPool>,\n}\n\nimpl ShardedPool {\n    async fn query_user(&self, user_id: Uuid) -> Result\u003CUser> {\n        let shard = get_shard(user_id, self.pools.len());\n        sqlx::query_as::\u003C_, User>(\"SELECT * FROM users WHERE id = $1\")\n            .bind(user_id)\n            .fetch_one(&self.pools[shard])\n            .await\n            .map_err(Into::into)\n    }\n    \n    async fn query_all_shards(&self, query: &str) -> Result\u003CVec\u003CRow>> {\n        let futures: Vec\u003C_> = self.pools.iter()\n            .map(|pool| sqlx::query(query).fetch_all(pool))\n            .collect();\n        \n        let results = futures::future::join_all(futures).await;\n        Ok(results.into_iter().flatten().flatten().collect())\n    }\n}\n```\n\n## تحديات التجزئة\n\n1. **الاستعلامات عبر التجزئات** — بطيئة ومعقدة\n2. **المعاملات الموزعة** — تحتاج 2PC أو saga\n3. **إعادة التوازن** — تغيير عدد التجزئات يتطلب نقل البيانات\n4. **مفتاح التجزئة** — اختيار سيء يسبب نقاط ساخنة\n\n## المقارنة\n\n| الجانب | التقسيم | التجزئة |\n|--------|---------|--------|\n| التعقيد | منخفض | مرتفع |\n| التوسع | عمودي | أفقي |\n| المعاملات | مدعومة | معقدة |\n| الصيانة | سهلة | صعبة |\n| أقصى حجم | ~1 تيرابايت | غير محدود |\n\n## الخلاصة\n\nابدأ بالتقسيم — إنه أبسط ويكفي لمعظم الحالات. انتقل للتجزئة فقط عندما تصل لحدود خادم واحد. والأهم: اختر مفتاح التجزئة بعناية لأنه صعب التغيير لاحقاً.","\u003Ch2 id=\"\">التقسيم مقابل التجزئة\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>\u003Cstrong>التقسيم\u003C\u002Fstrong> — تقسيم جدول واحد إلى أجزاء داخل نفس قاعدة البيانات\u003C\u002Fli>\n\u003Cli>\u003Cstrong>التجزئة\u003C\u002Fstrong> — توزيع البيانات عبر عدة خوادم قاعدة بيانات\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"\">متى يكفي التقسيم\u003C\u002Fh2>\n\u003Cp>التقسيم يكفي عندما:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>البيانات تتسع في خادم واحد\u003C\u002Fli>\n\u003Cli>الاستعلامات تستهدف قسماً واحداً عادةً\u003C\u002Fli>\n\u003Cli>لا تحتاج توسعاً أفقياً للكتابة\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"\">متى تحتاج التجزئة\u003C\u002Fh2>\n\u003Cp>التجزئة ضرورية عندما:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>حجم البيانات يتجاوز سعة خادم واحد\u003C\u002Fli>\n\u003Cli>حمل الكتابة يتجاوز قدرة خادم واحد\u003C\u002Fli>\n\u003Cli>تحتاج عزلاً جغرافياً للبيانات\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"\">استراتيجيات مفتاح التجزئة\u003C\u002Fh2>\n\u003Cpre>\u003Ccode class=\"language-rust\">\u002F\u002F تجزئة بالتجزئة\nfn get_shard(user_id: Uuid, num_shards: usize) -&gt; usize {\n    let hash = xxhash(&amp;user_id.as_bytes());\n    hash as usize % num_shards\n}\n\n\u002F\u002F تجزئة بالنطاق\nfn get_shard_by_date(created_at: DateTime, shards: &amp;[ShardConfig]) -&gt; &amp;ShardConfig {\n    shards.iter().find(|s| s.date_range.contains(&amp;created_at)).unwrap()\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"rust\">التجزئة مع Rust\u003C\u002Fh2>\n\u003Cpre>\u003Ccode class=\"language-rust\">struct ShardedPool {\n    pools: Vec&lt;PgPool&gt;,\n}\n\nimpl ShardedPool {\n    async fn query_user(&amp;self, user_id: Uuid) -&gt; Result&lt;User&gt; {\n        let shard = get_shard(user_id, self.pools.len());\n        sqlx::query_as::&lt;_, User&gt;(\"SELECT * FROM users WHERE id = $1\")\n            .bind(user_id)\n            .fetch_one(&amp;self.pools[shard])\n            .await\n            .map_err(Into::into)\n    }\n    \n    async fn query_all_shards(&amp;self, query: &amp;str) -&gt; Result&lt;Vec&lt;Row&gt;&gt; {\n        let futures: Vec&lt;_&gt; = self.pools.iter()\n            .map(|pool| sqlx::query(query).fetch_all(pool))\n            .collect();\n        \n        let results = futures::future::join_all(futures).await;\n        Ok(results.into_iter().flatten().flatten().collect())\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"\">تحديات التجزئة\u003C\u002Fh2>\n\u003Col>\n\u003Cli>\u003Cstrong>الاستعلامات عبر التجزئات\u003C\u002Fstrong> — بطيئة ومعقدة\u003C\u002Fli>\n\u003Cli>\u003Cstrong>المعاملات الموزعة\u003C\u002Fstrong> — تحتاج 2PC أو saga\u003C\u002Fli>\n\u003Cli>\u003Cstrong>إعادة التوازن\u003C\u002Fstrong> — تغيير عدد التجزئات يتطلب نقل البيانات\u003C\u002Fli>\n\u003Cli>\u003Cstrong>مفتاح التجزئة\u003C\u002Fstrong> — اختيار سيء يسبب نقاط ساخنة\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch2 id=\"\">المقارنة\u003C\u002Fh2>\n\u003Ctable>\u003Cthead>\u003Ctr>\u003Cth>الجانب\u003C\u002Fth>\u003Cth>التقسيم\u003C\u002Fth>\u003Cth>التجزئة\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\n\u003Ctr>\u003Ctd>التعقيد\u003C\u002Ftd>\u003Ctd>منخفض\u003C\u002Ftd>\u003Ctd>مرتفع\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>التوسع\u003C\u002Ftd>\u003Ctd>عمودي\u003C\u002Ftd>\u003Ctd>أفقي\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>المعاملات\u003C\u002Ftd>\u003Ctd>مدعومة\u003C\u002Ftd>\u003Ctd>معقدة\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>الصيانة\u003C\u002Ftd>\u003Ctd>سهلة\u003C\u002Ftd>\u003Ctd>صعبة\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>أقصى حجم\u003C\u002Ftd>\u003Ctd>~1 تيرابايت\u003C\u002Ftd>\u003Ctd>غير محدود\u003C\u002Ftd>\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003Ch2 id=\"\">الخلاصة\u003C\u002Fh2>\n\u003Cp>ابدأ بالتقسيم — إنه أبسط ويكفي لمعظم الحالات. انتقل للتجزئة فقط عندما تصل لحدود خادم واحد. والأهم: اختر مفتاح التجزئة بعناية لأنه صعب التغيير لاحقاً.\u003C\u002Fp>\n","ar","b0000000-0000-0000-0000-000000000001",true,"2026-03-28T10:44:32.817692Z","التجزئة مقابل التقسيم — بنية الجداول الضخمة","التجزئة (Sharding) مقابل التقسيم (Partitioning): المقارنة والاختيار لأحجام بيانات ضخمة.","PostgreSQL تجزئة تقسيم",null,"index, follow",[22,27,31,35],{"id":23,"name":24,"slug":25,"created_at":26},"c0000000-0000-0000-0000-000000000012","DevOps","devops","2026-03-28T10:44:21.513630Z",{"id":28,"name":29,"slug":30,"created_at":26},"c0000000-0000-0000-0000-000000000022","Performance","performance",{"id":32,"name":33,"slug":34,"created_at":26},"c0000000-0000-0000-0000-000000000005","PostgreSQL","postgresql",{"id":36,"name":37,"slug":38,"created_at":26},"c0000000-0000-0000-0000-000000000001","Rust","rust",[40,47,53],{"id":41,"title":42,"slug":43,"excerpt":44,"locale":12,"category_name":45,"published_at":46},"d0000000-0000-0000-0000-000000000686","لماذا Bali تتحول إلى مركز تكنولوجيا التأثير في جنوب شرق آسيا 2026","limadha-bali-tatahawwal-markaz-tiknulujia-attathir-janub-sharq-asia-2026","تحتل Bali المرتبة 16 بين أنظمة الشركات الناشئة في جنوب شرق آسيا. مع تركيز متزايد لبناة Web3 وشركات AI المستدامة الناشئة وشركات تكنولوجيا السفر البيئي، تنحت الجزيرة مكانتها كعاصمة تكنولوجيا التأثير في المنطقة.","الهندسة","2026-03-28T10:44:50.120618Z",{"id":48,"title":49,"slug":50,"excerpt":51,"locale":12,"category_name":45,"published_at":52},"d0000000-0000-0000-0000-000000000685","فسيفساء حماية البيانات في ASEAN: قائمة امتثال للمطورين","fusayfisa-himayat-albayanat-asean-qaimat-imtithal-lilmutawwirin","تمتلك سبع دول في ASEAN الآن قوانين شاملة لحماية البيانات، لكل منها نماذج موافقة ومتطلبات توطين وهياكل عقوبات مختلفة. إليك قائمة امتثال عملية للمطورين الذين يبنون تطبيقات متعددة البلدان.","2026-03-28T10:44:50.114369Z",{"id":54,"title":55,"slug":56,"excerpt":57,"locale":12,"category_name":45,"published_at":58},"d0000000-0000-0000-0000-000000000684","التحول الرقمي في Indonesia بقيمة 29 مليار دولار: فرص لشركات البرمجيات","attahawwul-arraqami-indonesia-29-milyar-dular-furas-sharikat-albarmajiyat","من المتوقع أن يصل سوق خدمات تكنولوجيا المعلومات في Indonesia إلى 29.03 مليار دولار في 2026، ارتفاعاً من 24.37 مليار دولار في 2025. البنية التحتية السحابية والذكاء الاصطناعي والتجارة الإلكترونية ومراكز البيانات تقود أسرع نمو في جنوب شرق آسيا.","2026-03-28T10:44:50.092728Z",{"id":13,"name":60,"slug":61,"bio":62,"photo_url":19,"linkedin":19,"role":63,"created_at":64,"updated_at":64},"Open Soft Team","open-soft-team","The engineering team at Open Soft, building premium software solutions from Bali, Indonesia.","Engineering Team","2026-03-28T08:31:22.226811Z"]