تعرف كيف تؤثر قواعد البيانات متعددة المستأجرين على الأمان والأداء، المخاطر الرئيسية (العزل، الجار الصاخب)، والضوابط العملية لحفظ أمان وسرعة المستأجرين.

تُعد قاعدة بيانات متعددة المستأجرين بنية يشارك فيها العديد من العملاء (المستأجرين) نفس نظام قاعدة البيانات—نفس خادم قاعدة البيانات، ونفس التخزين الأساسي، وغالبًا نفس المخطط—بينما يضمن التطبيق أن كل مستأجر يمكنه الوصول فقط إلى بياناته.
فكر فيها كعمارة سكنية: الجميع يشترك في هيكل المبنى والمرافق، لكن لكل مستأجر وحدته المغلقة بمفتاح.
في نهج مستأجر واحد، يحصل كل عميل على موارد قاعدة بيانات مخصّصة—مثل مثيل قاعدة بيانات خاص به أو خادم منفصل. العزل أبسط للفهم، لكنه عادة أغلى وأثقل تشغيلياً مع زيادة عدد العملاء.
مع تعددية المستأجرين، يتشارك المستأجرون البنية التحتية، مما قد يكون فعّالًا—لكن هذا يعني أن تصميمك يجب أن يفرض الحدود عمداً.
غالبًا ما تختار شركات SaaS تعددية المستأجرين لأسباب عملية:
تعددية المستأجرين بحد ذاتها ليست "آمنة" أو "سريعة" تلقائيًا. تعتمد النتائج على خيارات مثل كيفية فصل المستأجرين (مخططات، صفوف، أو قواعد بيانات)، كيفية فرض التحكم بالوصول، كيفية إدارة مفاتيح التشفير، وكيفية منع عبء عمل مستأجر واحد من إبطاء الآخرين.
يبني هذا الدليل بقية النقاش على تلك الخيارات—لأن الأمان والأداء في أنظمة متعددة المستأجرين هما ميزتان تبنيهما، لا افتراضات تُورث.
تعددية المستأجرين ليست خيارًا واحدًا—إنها طيف من مستوى مشاركة البنية التحتية. النموذج الذي تختاره يحدد حد العزل لديك (ما لا يجب مشاركته أبدًا)، وهذا يؤثر مباشرة على أمان قاعدة البيانات، عزل الأداء، والعمليات اليومية.
يحصل كل مستأجر على قاعدته الخاصة (غالبًا على نفس الخادم أو الكلستر).
حد العزل: قاعدة البيانات نفسها. هذه عادة قصة عزل أنظف لأن الوصول عبر مستأجرين عادة يتطلب عبور حد القاعدة.
مقايضات تشغيلية: أكثر تكلفة من حيث التشغيل على النطاق. قد تحتاج الترقيات وترحيلات المخطط إلى التشغيل آلاف المرات، وقد تصبح تجميعات الاتصالات معقدة. النسخ الاحتياطي/الاستعادة بسيطة على مستوى المستأجر، لكن عبء التخزين والإدارة ينمو بسرعة.
الأمان والضبط: عمومًا الأسهل لتأمينه وضبطه لكل عميل، ومناسب عندما للمستأجرين متطلبات امتثال مختلفة.
يشارك المستأجرون قاعدة بيانات، لكن لكل مستأجر مخطط خاص به.
حد العزل: المخطط. فصل ذو معنى، لكنه يعتمد على الأذونات والأدوات الصحيحة.
مقايضات تشغيلية: الترقيات والترحيلات لا تزال متكررة، لكنها أخف من قاعدة بيانات لكل مستأجر. النسخ الاحتياطي أكثر تعقيدًا: العديد من الأدوات تتعامل مع القاعدة كوحدة نسخ احتياطي، لذا عمليات مستوى المستأجر قد تتطلب تصدير المخطط.
الأمان والضبط: أسهل من مشاركة الجداول، لكن يجب الانضباط بشأن الصلاحيات وضمان أن الاستعلامات لا تشير إلى المخطط الخطأ.
يشارك الجميع قاعدة بيانات ومخطط، لكن لكل مستأجر جداول منفصلة (مثال: orders_tenant123).
حد العزل: مجموعة الجداول. يمكن أن يعمل لعدد صغير من المستأجرين، لكنه يتدرج بشكل سيئ: تضخم الميتاداتا، نصوص الترحيل تصبح مرهقة، وتخطيط الاستعلام قد يتدهور.
الأمان والضبط: يمكن أن تكون الأذونات دقيقة، ومع ذلك التعقيد التشغيلي مرتفع، ومن السهل الوقوع في أخطاء عند إضافة جداول أو ميزات جديدة.
يشارك الجميع نفس الجداول، ويميزون بعمود tenant_id.
حد العزل: طبقة الاستعلام والتحكم بالوصول (شائعًا أمن على مستوى الصف). هذا النموذج فعال تشغيليًا—مخطط واحد للترحيل، استراتيجية فهرسة واحدة—لكن يتطلب أقصى جهد من ناحية أمان قاعدة البيانات وعزل الأداء.
الأمان والضبط: الأصعب لتحقيق لأن كل استعلام يجب أن يكون واعيًا بالمستأجر، ومشكلة الجار الصاخب أكثر احتمالًا ما لم تضف تحديد موارد وتفهرس بعناية.
قاعدة مفيدة: كلما زاد مستوى المشاركة، سهلت الترقية—لكن زاد ما تحتاجه من انضباط في ضوابط العزل والأداء.
تعددية المستأجرين ليست مجرد "عدة عملاء في قاعدة واحدة". إنها تغير نموذج التهديد: الخطر الأكبر يتحول من المتسللين الخارجيين إلى مستخدمين مخولين قد يرون بيانات مستأجر آخر عن طريق الخطأ (أو عمدًا).
المصادقة تجيب عن "من أنت؟" التفويض يجيب عن "ما الذي يحق لك الوصول إليه؟" في قاعدة بيانات متعددة المستأجرين، يجب فرض سياق المستأجر (tenant_id, account_id, org_id) أثناء التفويض—لا تعاملها كمرشح اختياري.
خطأ شائع هو الافتراض أنه بمجرد مصادقة المستخدم ومعرفة مستأجره، سيبقى التطبيق استعلاماته مفصولة بشكل طبيعي. في الواقع، يجب أن يكون الفصل صريحًا ومفروضًا في نقطة تحكم ثابتة (مثل سياسات قاعدة البيانات أو طبقة استعلام إجبارية).
القاعدة الأبسط والأهم: كل قراءة وكتابة يجب أن تُقيد لمستأجر واحد بالضبط.
ينطبق ذلك على:
إذا كان تقييد المستأجر اختياريًا، فسوف يتم تجاهله في النهاية.
التسريبات عبر المستأجرين غالبًا تنبع من أخطاء صغيرة وروتينية:
tenant_id خاطئًاالاختبارات عادة تعمل ببيانات صغيرة وافتراضات نظيفة. الإنتاج يضيف التزامن، الإعادات، التخزين المؤقت، بيانات مستأجرين مختلطة، وحالات حافة حقيقية.
قد تجتاز ميزة الاختبارات لأنها تعمل على قواعد بيانات تحتوي مستأجرًا واحدًا فقط، أو لأن fixtures لا تتضمن تداخل معرفات بين المستأجرين. التصاميم الأكثر أمانًا تجعل من الصعب كتابة استعلام غير مقيد إطلاقًا بدل الاعتماد على مراجعات البشر.
الخطر الأساسي في قاعدة بيانات متعددة المستأجرين بسيط: استعلام نسى الترشيح حسب المستأجر قد يكشف بيانات مستأجر آخر. ضوابط العزل القوية تفترض حدوث أخطاء وتجعل تلك الأخطاء غير مؤذية.
يجب أن يحمل كل سجل مملوك للمستأجر معرف مستأجر (مثال tenant_id) ويجب أن تُقيّد طبقة الوصول للبيانات القراءة والكتابة دائمًا به.
نمط عملي هو "سياق المستأجر أولاً": يحدد التطبيق المستأجر (من نطاق فرعي، أو معرف المنظمة، أو مطالبات التوكن)، يخزنه في سياق الطلب، ويُرفض تنفيذ الوصول للبيانات بدون ذلك السياق.
الحواجز التي تساعد:
tenant_id في المفاتيح الأساسية/الفريدة حسب الحاجة (لمنع الاصطدام عبر المستأجرين).\n- أضف مفاتيح خارجية تشمل tenant_id حتى لا تُنشأ علاقات عبر مستأجرين بالخطأ.حيثما تتوفر (خاصة PostgreSQL)، يمكن لـ RLS نقل فحوصات المستأجر إلى قاعدة البيانات. السياسات يمكنها تقييد كل SELECT/UPDATE/DELETE بحيث تُرى فقط الصفوف المطابقة للمستأجر الحالي.
هذا يقلل الاعتماد على "تذكر كل مطوّر جملة WHERE"، كما أنه يحمي من بعض سيناريوهات الحقن أو سوء استعمال ORM. اعتبر RLS قفلًا ثانيًا، لا القفل الوحيد.
إذا كان للمستأجرين حساسية أعلى أو متطلبات امتثال أقوى، فإن فصل المستأجرين عبر مخطط (أو حتى قاعدة بيانات) يقلل من نصف القصف المحتمل. المقايضة هي تكلفة تشغيلية أعلى.
صمم الصلاحيات بحيث يكون الافتراضي "لا وصول":
تعمل هذه الضوابط بشكل أفضل معًا: تقييد صريح للمستأجر، سياسات مفروضة من قاعدة البيانات حيث أمكن، وصلاحيات محافظة تقلّص الضرر عند حدوث ثغرة.
التشفير من بين الضوابط القليلة التي تظل مفيدة حتى عندما تفشل طبقات العزل الأخرى. في مخزن مشترك، الهدف حماية البيانات أثناء النقل، أثناء السكون، وأثناء إثبات التطبيق للسياق الذي يعمل من أجله.
للبيانات أثناء النقل، اشترط TLS لكل نقطة وصل: العميل → API، API → قاعدة البيانات، وأي اتصالات داخلية. فُرضه على مستوى قاعدة البيانات حيث أمكن (مثلاً رفض الاتصالات غير TLS) حتى لا تتحول "استثناءات مؤقتة" إلى دائمة.
للبيانات في الراحة، استخدم تشفير مستوى القرص أو قاعدة البيانات (تشفير أقراص مُدارة، TDE، نسخ احتياطي مشفّر). هذا يحمي ضد فقدان الوسائط، تعرّض اللقطات، وبعض فئات اختراق البنية—لكنه لن يمنع استعلامًا معيبا من إرجاع صفوف مستأجر آخر.
مفتاح تشفير مشترك أبسط للتشغيل (مفاتيح أقل للتدوير، حالات فشل أقل). الجانب السلبي نصف العصف: إذا تعرض ذلك المفتاح فكل المستأجرين معرضين.
مفاتيح لكل مستأجر تقلّص نصف العصف وتساعد متطلبات العملاء، لكن التعقيد يرتفع: دورة حياة المفاتيح، جداول تدويرها، وسيناريوهات الدعم (ماذا يحدث إذا عطّل مستأجر مفتاحه).
تسوية عملية شائعة هي تشفير المغلف: مفتاح رئيسي يشفر مفاتيح بيانات لكل مستأجر، ما يجعل التدوير أقرب إلى قابلية الإدارة.
خزن بيانات اعتماد قواعد البيانات في مُدير أسرار، لا في متغيرات بيئة أو تكوين طويل العمر. فَضّل بيانات اعتماد قصيرة العمر أو تدوير تلقائي، وحدّد الوصول حسب دور الخدمة فتقيّد تأثير اختراق مُكوّن واحد.
عامل هوية المستأجر كأمر أمني حساس. لا تقبل معرف مستأجر خام من العميل كحقيقة. اربط سياق المستأجر بتوكنات موقعة وفحوصات على الخادم، وحقّق منه في كل طلب قبل أي استدعاء لقاعدة البيانات.
تعددية المستأجرين تغير ما يبدو "طبيعيًا". أنت لا تراقب قاعدة بيانات واحدة فقط—أنت تراقب عدة مستأجرين يشتركون في نفس النظام، حيث يمكن لخطأ واحد أن يتحول إلى تسريب عبر المستأجرين. القابلية للتدقيق والمراقبة الجيدة تقللان احتمال وحدّة الحوادث ونطاق أثرها.
على الأقل، سجّل كل إجراء يمكنه قراءة أو تغيير أو منح الوصول لبيانات المستأجر. أكثر أحداث التدقيق فائدة تجيب عن:
سجل أيضًا الإجراءات الإدارية: إنشاء مستأجرين، تغيير سياسات العزل، تعديل RLS، تدوير المفاتيح، وتغيير سلاسل الاتصال.
يجب أن تكشف المراقبة عن أنماط غير محتملة في الاستخدام السليم:
اربط التنبيهات بدلائل تشغيل قابلة للتنفيذ: ماذا تفحص، كيف تحتوِّن، ومن تستدعي.
عامل الوصول المميّز كتغيير إنتاجي. استخدم أدوارًا بأقل امتياز ممكن، بيانات اعتماد قصيرة العمر، وموافقات للعمليات الحساسة (تغييرات المخطط، تصدير البيانات، تعديل السياسات). لحالات الطوارئ، احتفظ بحساب break-glass مضبوط جيدًا: بيانات اعتماد منفصلة، تذكرة/موافقة إلزامية، وصول محدود زمنياً، وتسجيل إضافي.
حدد فترات الاحتفاظ بناءً على متطلبات الامتثال والتحقيق، لكن قيد وصول السجلات حتى لا يرى موظفو الدعم سجلات مستأجرين آخرين. عند طلب العملاء تقارير تدقيق، قدّم تقارير مصفّاة حسب المستأجر بدلًا من سجلات مشتركة خام.
تعددية المستأجرين تزيد الكفاءة بالسماح لعدة عملاء بمشاركة نفس بنية قاعدة البيانات. المقابل أن الأداء يصبح تجربة مشتركة أيضًا: ما يفعله مستأجر واحد قد يؤثر على الآخرين، حتى لو كانت بياناتهم معزولة تمامًا.
"الجار الصاخب" هو مستأجر نشاطه كثيف جدًا أو متقلب لدرجة أنه يستهلك أكثر من حصته العادلة من الموارد المشتركة. قاعدة البيانات ليست "معطلة"—بل مشغولة بمعالجة عمل ذلك المستأجر، فبقية المستأجرين ينتظرون أطول.
تخيل عمارة مشتركة بمياه ضغط واحد: وحدة واحدة تشغّل عدة دوشات وغسالة في نفس الوقت، فيشعر الباقون بانخفاض الضغط.
حتى عندما يكون لكل مستأجر صفوف أو مخططات منفصلة، العديد من مكونات الأداء الحساسة تظل مشتركة:
عندما تتشبّع هذه التجمعات المشتركة، يرتفع التأخير للجميع.
العديد من أحمال SaaS تأتي على هيئة دفعات: استيراد، تقارير نهاية الشهر، حملة تسويقية، وظيفة مجدولة تعمل عند بداية الساعة.
تفجّرات الطلبات يمكن أن تخلق "ازدحامات" داخل قاعدة البيانات:
حتى لو استمر الانفجار لبضع دقائق فقط، يمكن أن يسبب تأخيرات متتابعة أثناء تفريغ الطوابير.
من منظور العميل، تبدو مشاكل الجار الصاخب عشوائية وغير عادلة. الأعراض الشائعة:
هذه الأعراض علامات مبكرة أنك بحاجة إلى تقنيات عزل أداء بدلاً من الاعتماد فقط على "مزود عتاد أكثر".
تعمل تعددية المستأجرين أفضل عندما لا يستطيع عميل واحد "استعارة" أكثر من حصته العادلة من سعة قاعدة البيانات. عزل الموارد هو مجموعة الحواجز التي تمنع مستأجرًا ثقيلًا من إبطاء الجميع.
فشل شائع هو الاتصالات غير المقيدة: ارتفاع حركة مستأجر يفتح مئات الجلسات ويجوع قاعدة البيانات.
ضع حدودًا صارمة في مكانين:
حتى لو لم تستطع قاعدتك فرض "اتصالات لكل مستأجر" مباشرة، يمكنك تقريب ذلك بتوجيه كل مستأجر عبر تجمع مخصّص أو تقسيم المجمع.
تحديد المعدل يتعلق بالعدالة عبر الزمن. طبّقه قريبًا من الحافة (بوابة API/التطبيق) وحيثما دعم ذلك داخل القاعدة (مجموعات موارد/إدارة الأحمال).
أمثلة:
احمِ القاعدة من الاستعلامات "الجارية إلى اللانهاية":
يجب أن تفشل هذه الضوابط برشاقة: إرجاع خطأ واضح واقتراح إعادة المحاولة/التراجع.
حرك الحركة الثقيلة للقراءة بعيدًا عن الأساسي:
الهدف ليس السرعة فقط—بل تقليل ضغط الأقفال والاستهلاك على CPU كي تقل وسائل تأثير المستأجرين الصاخبين.
مشكلات الأداء في تعددية المستأجرين غالبًا ما تبدو كأن "القاعدة بطيئة"، لكن السبب الجذري عادة نموذج البيانات: كيف يُفهرس، يُفلتر، ويُرتب بيانات المستأجرين فعليًا. التشكيل الجيد يجعل استعلامات نطاق المستأجر سريعة بطبيعتها؛ السيء يجبر القاعدة على عمل زائد.
معظم استعلامات SaaS يجب أن تتضمن معرف المستأجر. نمذج ذلك صريحًا (مثال tenant_id) وصمّم فهارس تبدأ به. عمليًا، فهرس مركب مثل (tenant_id, created_at) أو (tenant_id, status) أكثر فائدة من فهرسة created_at أو status بمفرده.
ينطبق ذلك أيضًا على التفرد: إذا كانت الرسائل الإلكترونية فريدة ضمن المستأجر فقط، فطبق تفردًا على (tenant_id, email) بدلًا من قييد email عالمي.
نمط استعلام بطيء شائع هو مسح عبر المستأجرين: استعلام نسي فلتر المستأجر ولمس جزءًا ضخمًا من الجدول.
اجعل المسار الآمن هو السهل:
التقسيم يقلل كمية البيانات التي يجب أن تنظر إليها كل استعلام. قسّم حسب المستأجر عندما يكون للمستأجرين أحجام كبيرة وغير متساوية. قسم حسب الزمن عندما يكون الوصول حديثًا في الغالب (أحداث، سجلات، فواتير)، عادة مع tenant_id كبداية فهرسية داخل كل قسم.
فكّر في التشتيت (sharding) عندما لا تستطيع قاعدة بيانات واحدة تلبية ذروة العرض، أو عندما يهدد حمل مستأجر واحد الجميع.
"المستأجرون الساخنون" يظهرون حجم قراءة/كتابة غير متناسب، احتكاك أقفال، أو فهارس ضخمة.
اكتشفهم بتتبُّع زمن الاستعلام لكل مستأجر، الصفوف المقروءة، ومعدلات الكتابة. عندما يهيمن مستأجر، عزله: انقله لشارد/قاعدة منفصلة، قسم جداول كبيرة حسب المستأجر، أو أدخل كاشات مخصّصة وحدودًا حتى يحافظ الآخرون على سرعتهم.
نادراً ما تفشل تعددية المستأجرين لأن "القاعدة لا تستطيع"—بل تفشل عندما تسمح العمليات اليومية بتراكم تناقضات تتحول إلى فجوات أمان أو تراجعات أداء. الهدف جعل المسار الآمن الافتراضي لكل تغيير، مهمة، ونشر.
اختر معرف مستأجر قياسي واحد (مثلاً tenant_id) واستخدمه باستمرار عبر الجداول، الفهارس، السجلات، وواجهات برمجة التطبيقات. الاتساق يقلل أخطاء الأمان (استعلام على مستأجر خاطئ) ومفاجآت الأداء (فهرس مركب مفقود).
حواجز عملية:
tenant_id في جميع مسارات الوصول الرئيسية (استعلامات، مستودعات، نطاقات ORM)\n- أضف فهارس مركبة تبدأ بـ tenant_id للبحث الشائع\n- فضّل قيود قاعدة البيانات حيث أمكن (مفاتيح خارجية تشمل tenant_id أو قيود تحقق) للإمساك بالكتابات الخاطئة مبكرًاالعمال اللازامنيون مصدر شائع لحوادث عبر المستأجرين لأنهم يعملون "خارج نطاق" الطلب الذي أنشأ سياق المستأجر.
أنماط تشغيلية مفيدة:
tenant_id صراحة في حمولة كل مهمة؛ لا تعتمد على السياق البيئي\n- أدرج مفتاح المستأجر في مفاتيح عدم التكرار وكاشات النتائج\n- سجّل tenant_id عند بدء/انتهاء المهمة وعلى كل إعادة محاولة لتسريع التحقيقيجب أن تكون ترحيلات المخطط والبيانات قابلة للنشر دون حاجة لتزامن مثالي.
استخدم تغييرات متدرجة:
أضف اختبارات سلبية آلية تحاول عمدًا الوصول لبيانات مستأجر آخر (قراءة وكتابة). اعتبر هذه اختبارات حاجزة للإصدار.
أمثلة:
tenant_id غير مطابق والتحقق من فشل قاطع\n- اختبارات ارتداد لأي مُساعد استعلام للتأكد من تطبيق تقييد المستأجر دائمًاالنسخ الاحتياطية سهل وصفها ("انسخ القاعدة") وصعب تنفيذها بأمان في تعددية المستأجرين. لحظة مشاركة جداول متعددة المستأجرين، تحتاج خطة لاستعادة مستأجر واحد دون تعريض أو الكتابة فوق الآخرين.
نسخة قاعدة بيانات كاملة لا تزال أساس التعافي من الكوارث، لكنها ليست كافية لحالات الدعم اليومية. النهج الشائعة:
tenant_id) لاستعادة بيانات مستأجر واحد\n- تخزين منفصل لكل مستأجر (عند الإمكان) لجعل الاستعادات محدودة بطبيعتهاإذا اعتمدت على التصديرات المنطقية، اعتبر عملية التصدير ككود إنتاج: يجب أن تفرض عزل المستأجر (مثلاً عبر RLS) بدلًا من الوثوق بـ WHERE مكتوب مرة ونسيان.
طلبات الخصوصية (تصدير، حذف) عمليات على مستوى المستأجر تلمس الأمان والأداء. ابنِ سير عمل مكرر ومُسجّل لـ:
أكبر خطر ليس مخترقًا—بل مشغّل متعجل. قلّل الأخطاء البشرية بحواجز:
tenant_id قبل الاستيراد\n- استعد في بيئة حجر صحي أولًا، ثم قم بالترقيةبعد تمرين التعافي، لا تتوقف عند "التطبيق يعمل". شغّل فحوصات آلية تؤكد عزل المستأجر: استعلامات عيّنة عبر مستأجرين، مراجعة سجلات التدقيق، وتحقق أن مفاتيح التشفير والأدوار ما زالت معزولة كما ينبغي.
تعددية المستأجرين غالبًا الخيار الافتراضي الأفضل لـ SaaS، لكنها ليست قرارًا دائمًا. مع نمو المنتج ومزيج العملاء، قد تصبح مقاربة "مخزن بيانات مشترك" مخاطرة تجارية أو تبطئ التسليم.
فكّر في الانتقال من مشاركة كاملة إلى عزلة أكبر عندما تلاحظ باستمرار:
لا تحتاج للاختيار بين "كله مشترك" و"كله مخصّص". منهجيات هجينة شائعة:
زيادة العزل عادة تعني إنفاق بنية تحتية أعلى، عبء تشغيلي أكبر (ترحيلات، مراقبة، منع الأعطال)، وتنسيق إصدارات أكثر (تغييرات مخطط عبر بيئات متعددة). المقابل ضمانات أداء أوضح ومحادثات امتثال أبسط.
إذا تقيم خيارات العزل، راجع الأدلة المرتبطة في /blog أو قارن الخطط وخيارات النشر على /pricing.
إذا أردت بناء نموذج SaaS سريعًا واختبار افتراضات تعددية المستأجرين مبكرًا (تقييد المستأجر، مخططات مناسبة لـ RLS، تحديد المعدل، وسير عمل تشغيلي)، منصة تطوير تفاعلية مثل Koder.ai تستطيع مساعدتك في إنشاء تطبيق React + Go + PostgreSQL من المحادثة، التكرار في وضع التخطيط، والنشر مع لقطات واسترجاع—ثم تصدير الشيفرة المصدرية عندما تكون جاهزًا لتقوية البنية الإنتاجية.
قاعدة بيانات متعددة المستأجرين هي بنية يشارك فيها عدة عملاء نفس بنية قاعدة البيانات (وغالبًا نفس المخطط)، بينما يضمن التطبيق و/أو قاعدة البيانات أن كل مستأجر يمكنه الوصول فقط إلى بياناته. المطلب الأساسي هو التقييد الصارم للمستأجر في كل عملية قراءة وكتابة.
غالبًا ما تُختار تعددية المستأجرين لأن:
المقابل هو وجوب بناء ضوابط عزل وأداء مقصودة.
النماذج الشائعة (من عزل أكبر إلى مشاركة أكبر):
اختيارك يحدد حد العزل وحِمل التشغيل.
أكبر خطر يتحول إلى الوصول عبر المستأجرين الناتج عن أخطاء روتينية، وليس فقط المهاجمين الخارجيين. يجب التعامل مع سياق المستأجر (مثل tenant_id) كشرط تفويض إلزامي، لا كمرشح اختياري. كما يجب افتراض تعقيدات الإنتاج مثل التزامن، التخزين المؤقت، الإعادات، والمهام الخلفية.
الأسباب الشائعة لتسريبات عبر المستأجرين تشمل:
tenant_id خاطئًاصمم ضوابط تجعل الاستعلامات غير المقيدة صعبة أو مستحيلة.
يُنقل التحقق من المستأجر إلى قاعدة البيانات عبر سياسات RLS (أمن على مستوى الصف) التي تقيد SELECT/UPDATE/DELETE لتطابق المستأجر الحالي. تقلل RLS الاعتماد على "تذكر الجميع WHERE"، لكنها يجب أن تُدمج مع تقييد في طبقة التطبيق، مبدأ الأقل امتيازًا، واختبارات قوية. اعتبر RLS قفلًا إضافيًا وليس القفل الوحيد.
أساسيات العزل العملية تشمل:
tenant_id قياسي على جداول ملكية المستأجرينtenant_idالهدف جعل الأخطاء تفشل بأمان.
التشفير مفيد لكنه يعالج مخاطر مختلفة:
أيضًا اعتبر هوية المستأجر معلومات حساسة: لا تثق بـ tenant_id الخام من العميل؛ اربطه بتوكنات موقعة وفحوصات على الخادم.
مشاكل الجار الصاخب تظهر عندما يستهلك مستأجر الموارد المشتركة (CPU، الذاكرة، I/O، الاتصالات)، مما يزيد زمن الاستجابة للآخرين. تدابير عملية:
الهدف العدالة، لا فقط أقصى إنتاجية.
حان وقت زيادة العزل عندما تلاحظ:
خيارات هجينة شائعة: تخصيص عدد صغير من المستأجرين الرئيسيين لبيئات منفصلة، عروض طبقية (مشترك مقابل مخصّص)، أو عزل التحليلات لمستأجرين ثقيلين.