Διαχωρισμός
Το όριο που κρατά η βάση δεδομένων, όχι ο κώδικας
Κάθε CRM ισχυρίζεται ότι είναι multi-tenant. Ο ισχυρισμός είναι φθηνός· αυτό που μετράει είναι ποιο επίπεδο κρατά τη γραμμή. Αν η απάντηση είναι «η εφαρμογή μας προσθέτει πάντα το σωστό φίλτρο», τότε η εγγύηση είναι μόνο τόσο καλή όσο ο λιγότερο ξεκουρασμένος προγραμματιστής που έγραψε ποτέ ένα query.
Το iKonekt ήταν multi-tenant από την πρώτη του μετάβαση και όχι προσαρμοσμένο εκ των υστέρων, που ακούγεται ως καύχημα και στην πραγματικότητα είναι μια ομολογία: η εκ των υστέρων προσαρμογή είναι σχεδόν αδύνατο να γίνει πειστικά, και όλοι όσοι το δοκίμασαν έχουν μια ιστορία.
Ο διαχωρισμός ζει στη βάση δεδομένων. Κάθε ένας από τους είκοσι έξι πίνακες φέρει τον μισθωτή στον οποίο ανήκει, και η πολιτική που τον ελέγχει εκτελείται σε κάθε ανάγνωση και κάθε εγγραφή, εντελώς κάτω από την εφαρμογή. Ένα query που ξεχνά το όριο δεν επιστρέφει τους πελάτες κάποιου άλλου. Δεν επιστρέφει τίποτα.
Ασφάλεια σε επίπεδο γραμμής, επιβεβλημένη
Όχι μια σύμβαση, όχι ένας κανόνας code review. Η βάση δεδομένων αρνείται. Εβδομήντα δύο πολιτικές, γραμμένες μία μία και όχι παραγόμενες — γιατί μια παραγόμενη πολιτική είναι μια πολιτική που κανείς δεν έχει διαβάσει.
Σύνθετα κλειδιά
Μια θυγατρική καταγραφή αναφέρεται στον μισθωτή της και στον γονέα της μαζί, ως ζεύγος. Ένας χαμένος αναγνωριστικός κωδικός από λάθος εταιρεία δεν επιλύεται — απλώς δεν είναι έγκυρη αναφορά.
Κανένας προεπιλεγμένος μισθωτής, ποτέ
Ένα αίτημα χωρίς εύρος δεν γίνεται αθόρυβα αίτημα για τον μισθωτή μηδέν. Απορρίπτεται πριν φτάσει στη βάση δεδομένων. Δεν υπάρχει λειτουργία «χωρίς εύρος» που να μπορεί κανείς να ξεχάσει να απενεργοποιήσει.
Το σφάλμα που δεν μπορούσε να ανακοινωθεί
Όσο γινόταν η εργασία πολυενοικίασης, τα περισσότερα λάθη ήταν θορυβώδη. Δώστε σε δύο εταιρείες το ίδιο πεδίο πελάτη και τα αντικείμενα της βάσης δεδομένων συγκρούονται αμέσως, με κωδικό σφάλματος και stack trace· το διορθώνετε πριν το μεσημεριανό.
Ένα δεν διαμαρτυρήθηκε. Ένας πίνακας επεξεργάσιμων παρακάμψεων προτροπών ήταν κλειδωμένος μόνο στο είδος της προτροπής — όχι σε είδος και εταιρεία. Μια δεύτερη εταιρεία που επεξεργαζόταν το δικό της αντίγραφο θα είχε ανεπαίσθητα αντικαταστήσει αυτό της πρώτης, μέσω απολύτως έγκυρου SQL, χωρίς σφάλμα, χωρίς προειδοποίηση και χωρίς αποτυχημένο τεστ. Βρέθηκε διαβάζοντας έναν-έναν όλα τα υπόλοιπα μοναδικά ευρετήρια μετά από αλλαγή κλειδιού, με την υποψία ότι τα θορυβώδη είχαν παρέα.
Το αναφέρουμε επειδή αυτή είναι η ειλικρινής μορφή αυτής της δουλειάς. Ο διαχωρισμός δεν είναι μια λειτουργία που ενεργοποιείτε· είναι μια συνήθεια ανάγνωσης των βαρετών τμημάτων του σχήματος, με την υπόθεση ότι κάτι εκεί μέσα διαφωνεί μαζί σας.
Τα τεστ, για την ιστορία: 942 συνολικά, εκτελούνται σε βάση δεδομένων που ξαναχτίζεται από το μηδέν σε κάθε αλλαγή. Δεν υπάρχουν για να αποδείξουν ότι ο σχεδιασμός είναι έξυπνος. Υπάρχουν επειδή ο τρόπος αστοχίας αυτού του συγκεκριμένου σχεδιασμού είναι σιωπηλός, και οι σιωπηλές αποτυχίες χρειάζονται κάποιον να φωνάζει εκ μέρους τους.
Τι κερδίζει ένας κοινός θνητός από τον διαχωρισμό
- Ένας όμιλος μπορεί να λειτουργεί πολλές εταιρείες από μία εγκατάσταση, και ένας πωλητής της μίας δεν θα δει ποτέ πελάτη μιας άλλης — όχι βάσει πολιτικής, αλλά εκ κατασκευής.
- Ένα πρόγραμμα συνεργατών, ένα σύνολο προτροπών, μια διεκδίκηση πελάτη: όλα έχουν εμβέλεια ανά εταιρεία, ώστε η ρύθμιση ενός μισθωτή να μην μπορεί να γίνει κτήμα όλων.
- Ένα αίτημα διαγραφής εκπληρώνεται εντός ενός ορίου και όχι πάνω σε κοινό σωρό, και αυτό ακριβώς καθιστά δυνατή μια ειλικρινή απάντηση.
- Και κανείς δεν χρειάζεται να το θυμάται. Αυτό είναι το ζητούμενο — μια εγγύηση που εξαρτάται από το να θυμάται κανείς δεν είναι εγγύηση.
Ακόμη μία γραμμή που δεν αφορά βάσεις δεδομένων
Κάθε αδελφή υπηρεσία της οικογένειας διαθέτει το δικό της επώνυμο διαπιστευτήριο. Τίποτα δεν μιλά με κοινό διαπιστευτήριο, ώστε καμία υπηρεσία να μην μπορεί κατά λάθος να ενεργήσει ως άλλη — μια μικρή πειθαρχία που προέκυψε απευθείας από το ότι κάποτε είχαμε κοινό token και δεν το ευχαριστηθήκαμε.
Είναι το ίδιο ένστικτο με τον κανόνα της βάσης δεδομένων. Κάντε το λάθος αδύνατο αντί για αποθαρρυντικό, και ξοδεύετε την προσοχή σας σε πελάτες αντί σε επαγρύπνηση.
- 126 πίνακεςΚαθένας φέρει τον μισθωτή του, με τον έλεγχο επιβεβλημένο.
- 272 πολιτικέςΓραμμένες μία προς μία, ώστε καθεμία να έχει διαβαστεί από άνθρωπο.
- 3942 τεστΣε βάση δεδομένων που ξαναχτίζεται από το μηδέν, σε κάθε αλλαγή.
- 40 προεπιλεγμένοι μισθωτέςΈνα αίτημα χωρίς εμβέλεια δεν φτάνει ποτέ στα δεδομένα.
Μετρημένο στη ζωντανή έκδοση

«Η εφαρμογή μας φιλτράρει πάντα ανά εταιρεία.»
Το «πάντα» κάνει πολύ δουλειά σε αυτή την πρόταση.
Μετακινήστε το όριο προς τα κάτω, στη βάση δεδομένων, και μια ξεχασμένη ρήτρα WHERE επιστρέφει τίποτα αντί για πελάτες κάποιου άλλου. Μια κενή οθόνη είναι καλύτερη αποτυχία από μια αμήχανη γνωριμία.
Για ομίλους που λειτουργούν πολλές μάρκες →