الفصل
الحد اللي تحفظه قاعدة البيانات، ما الكود
كل نظام إدارة عملاء يدّعي إنه متعدد المنشآت. الادعاء رخيص؛ المهم أي طبقة هي اللي تحرس الحد. إذا الجواب هو «تطبيقنا دايماً يضيف الفلتر الصح»، فالضمان قيمته بس قد أحد أقل مطوّر مرتاح كتب استعلاماً في حياته.
iKonekt كان متعدد المنشآت من أول ترحيل لقاعدة البيانات، ما هوشي شي انضاف من بعد، وهذا يبان مفاخرة وهو في الحقيقة اعتراف: إضافته من بعد شبه مستحيل تتجلى بشكل مقنع، وكل واحد جرب عنده حكاية.
الفصل يسكن في قاعدة البيانات. كل جدول من الجداول الستة وعشرين يحمل المنشأة اللي يتبع لها، والسياسة اللي تتحقق منه تشتغل على كل قراءة وكل كتابة، تحت التطبيق تماماً. الاستعلام اللي ينسى الحد ما يرجع عملاء غيرك. ما يرجع شيء.
أمان على مستوى الصفوف، مفروض
ما هوشي اتفاق، ما هوشي قاعدة مراجعة كود. قاعدة البيانات ترفض. اثنتين وسبعين سياسة، مكتوبة وحدة وحدة بدل ما تنعُم تلقائياً — لأن السياسة المولّدة تلقائياً سياسة ما قراها حد.
المفاتيح المركبة
السجل التابع يُحيل لمنشأته ولسجله الأصل معاً، كزوج. المعرّف الغريب من شركة أخرى ما ينحلّ — هو ببساطة ما هوشي إحالة صحيحة.
لا مستأجر افتراضي، أبداً
الطلب الذي يأتي بدون نطاق لا يتحول بصمت إلى طلب للمستأجر صفر. يرمي خطأ قبل أن يصل إلى قاعدة البيانات. لا يوجد وضع "بدون نطاق" يمكن أن تنسى إطفاءه.
الخطأ الذي لم يستطع أن يصرخ
أثناء العمل على فصل المستأجرين، كانت معظم الأخطاء صاخبة. أعطِ شركتين نفس نطاق العميل وستصرخ كائنات قاعدة البيانات فوراً برمز خطأ ومسار تتبع؛ تصلحها قبل الغداء.
واحد لم يعترض. جدول لتعديلات التوجيهات القابلة للتحرير كان مفتاحه على نوع التوجيه وحده — لا على النوع والمستأجر معاً. شركة ثانية تعدّل نسختها الخاصة فتستبدل بصمت نسخة الشركة الأولى، عبر SQL صالح تماماً، بلا خطأ، بلا تحذير، وبلا اختبار يفشل. اكتُشف بقراءة كل فهرس فريد متبقٍ بعد تغيير مفتاح، واحداً تلو الآخر، على ظن أن الصاخبة لها رفقة.
نذكره لأنه الشكل الصادق لهذا العمل. الفصل ليس ميزة تشغّلها؛ إنه عادة قراءة الأجزاء المملة من المخطط على افتراض أن شيئاً فيها يخالفك.
الاختبارات، للسجل: 942 منها، تُشغَّل على قاعدة بيانات تُبنى من الصفر مع كل تغيير. ليست هناك لإثبات أن التصميم ذكي. إنها هناك لأن نمط فشل هذا التصميم صامت، والفشل الصامت يحتاج أحداً يصرخ نيابة عنه.
ما يكسبه الشخص العادي من الفصل
- يمكن لمجموعة أن تدير عدة شركات من تنصيب واحد، وبائع في إحداها لن يرى عميل الأخرى أبداً — ليس بالسياسة، بل بالبناء.
- برنامج شركاء، مجموعة توجيهات، مطالبة بعميل: كلها محدودة النطاق لكل شركة، فلا يمكن لتكوين مستأجر واحد أن يصبح ملك الجميع.
- طلب المحو يُستجاب له داخل حدود بدلاً من كومة مشتركة، وهذا ما يجعل الإجابة بصدق ممكنة.
- ولا يحتاج أحد أن يتذكر أي شيء من ذلك. هذه هي النقطة — الضمان الذي يعتمد على أن يُتذكر ليس ضماناً.
سطر آخر لا يتعلق بقواعد البيانات
كل خدمة شقيقة في العائلة تحمل بيانات اعتمادها المسماة الخاصة. لا شيء يتحدث ببيانات مشتركة، فلا يمكن لخدمة أن تتصرف بالخطأ كخدمة أخرى — انضباط صغير جاء مباشرة من امتلاك رمز مشترك ذات مرة وعدم الاستمتاع بذلك.
إنه نفس الغريزة كقاعدة قاعدة البيانات. اجعل الشيء الخاطئ مستحيلاً لا مستنكراً فقط، وستصرف انتباهك على العملاء بدلاً من اليقظة.
- 126 جدولاًكل واحد يحمل مستأجره، مع إجبار الفحص.
- 272 سياسةمكتوبة فردياً، بحيث قرأها شخص لكل واحدة.
- 3942 اختبارعلى قاعدة بيانات تُبنى من الصفر، مع كل تغيير.
- 40 مستأجر افتراضيالطلب بدون نطاق لا يصل إلى البيانات أبداً.
مقاس على البناء الحي

«تطبيقنا يفلتر دائماً حسب الشركة.»
كلمة "دائماً" تقوم بعمل كثير في تلك الجملة.
انقل الحد إلى داخل قاعدة البيانات، وشرط WHERE المنسي يعيد لا شيء بدلاً من عملاء شخص آخر. الشاشة الفارغة فشل أفضل من تعارف محرج.
للمجموعات التي تدير عدة علامات ←