הפרדה
הגבול ששומרת מסד הנתונים, לא הקוד
כל CRM טוען שהוא רב-דיירים. הטענה זולה; מה שחשוב הוא באיזו שכבה נשמר הגבול. אם התשובה היא "האפליקציה שלנו תמיד מוסיפה את המסנן הנכון", אז הערבה טובה רק כמו המפתח העייף ביותר שכתב פעם שאילתה.
iKonekt היה רב-דיירים מהמיגרציה הראשונה שלו ולא הותאם בדיעבד — זה נשמע כמו התפארות והוא בעצם הודאה: התאמה בדיעבד כמעט בלתי אפשרית לביצוע באופן משכנע, ולכל מי שניסה יש סיפור.
ההפרדה חיה במסד הנתונים. כל אחת מעשרים ושש הטבלאות נושאת את הדייר שאליו היא שייכת, והמדיניות שבודקת זאת רצה על כל קריאה וכל כתיבה, מתחת לאפליקציה לגמרי. שאילתה ששוכחת את הגבול לא מחזירה את הלקוחות של מישהו אחר. היא לא מחזירה כלום.
אבטחה ברמת שורה, בכפייה
לא הסכם, לא כלל של סקירת קוד. מסד הנתונים מסרב. שבעים ושתיים מדיניות, שנכתבו אחת-אחת ולא נוצרו אוטומטית — כי מדיניות שנוצרה אוטומטית היא מדיניות שאף אחד לא קרא.
מפתחות מורכבים
רשומת בן מפנה אל הדייר שלה וגם אל ההורה שלה, יחד כזוג. מזהה תועה מהחברה הלא נכונה לא נפתר — הוא פשוט אינו הפניה תקפה.
בלי דייר ברירת מחדל, אף פעם
בקשה בלי היקף לא הופכת בשקט לבקשה עבור דייר אפס. היא נזרקת עוד לפני שהיא מגיעה למסד הנתונים. אין מצב "ללא היקף" שאפשר לשכוח לכבות.
הבאג שלא יכול היה להכריז על עצמו
בזמן שעבודת ההפרדה בין דיירים נעשתה, רוב הטעויות היו רועשות. תן לשתי חברות את אותו תחום לקוח ואת אובייקטי מסד הנתונים מיד, עם קוד שגיאה ומעקב מחסנית; אתה מתקן את זה לפני ארוחת הצהריים.
אחת לא מחתה. טבלה של דריסות־על של פרומפטים הניתנות לעריכה מופתה לפי סוג הפרומפט בלבד — לא לפי סוג וגם דייר. חברה שנייה שערכה את העותק שלה הייתה דורסת בשקט את זו של החברה הראשונה, באמצעות SQL תקין לגמרי, בלי שגיאה, בלי אזהרה ובלי בדיקה שנכשלת. זה התגלה על ידי קריאה של כל אינדקס ייחודי שנותר, אחד אחרי השני, מתוך חשד שלרועשים יש חברים.
אנחנו מזכירים את זה כי זה הצורה הכנה של העבודה הזאת. הפרדה היא לא פיצ'ר שאתה מפעיל; היא הרגל של קריאת החלקים המשמימים של הסכימה מתוך הנחה שמשהו שם לא מסכים איתך.
הבדיקות, לידיעת הכל: 942 מהן, שרצות מול מסד נתונים שנבנה מאפס בכל שינוי. הן לא שם כדי להוכיח שהתכנון חכם. הן שם כי מצב הכשל של התכנון הזה הוא שקט, וכשלים שקטים צריכים מישהו שיצעק בשמם.
מה ההפרדה נותנת לאדם רגיל
- קבוצה יכולה להפעיל כמה חברות מהתקנה אחת, ומוכר באחת מהן לעולם לא יראה לקוח של אחרת — לא במדיניות, אלא בבנייה.
- תוכנית שותפים, קבוצת פרומפטים, תביעה על לקוח: הכול מוגדר לפי חברה, כך שהתצורה של דייר אחד לא יכולה להפוך לשל כולם.
- בקשת מחיקה מכובדת בתוך גבול ולא על ערימה משותפת, וזה בדיוק מה שמאפשר לענות עליה ביושר.
- ואף אחד לא צריך לזכור את זה. זו הנקודה — ערבות שתלויה בזכירה אינה ערבות.
עוד שורה אחת שאינה על מסדי נתונים
כל שירות אח במשפחה מחזיק אישור גישה בשם משלו. אף אחד לא מדבר עם אישור משותף, ולכן אף שירות לא יכול לפעול בטעות כשירות אחר — משמעת קטנה שנבעה ישירות מכך שפעם היה לנו אסימון משותף ולא נהנינו ממנו.
זה אותו אינסטינקט כמו כלל מסד הנתונים. הפוך את הדבר הלא נכון לבלתי אפשרי ולא רק לא מומלץ, ותשקיע את תשומת הלב שלך בלקוחות במקום בערנות.
- 126 טבלאותכל אחת נושאת את הדייר שלה, עם בדיקה מאולצת.
- 272 מדיניותנכתבו אחת לאחת, כך שכל אחת נקראה על ידי אדם.
- 3942 בדיקותמול מסד נתונים שנבנה מאפס, בכל שינוי.
- 40 דיירי ברירת מחדלבקשה בלי היקף לעולם לא מגיעה לנתונים.
נמדד על הבנייה החיה

“האפליקציה שלנו תמיד מסננת לפי חברה.”
המילה “תמיד” עושה עבודה כבדה מאוד במשפט הזה.
הזז את הגבול מטה אל מסד הנתונים, ופסוקית WHERE שנשכחה תחזיר כלום במקום את הלקוחות של מישהו אחר. מסך ריק הוא כשל טוב יותר מהיכרות מביכה.
לקבוצות שמפעילות כמה מותגים ←