Adskillelse
Grensen databasen holder, ikke koden
Hvert CRM påstår at det er flerleietaker. Påstanden er billig; det som betyr noe er hvilket lag som holder linjen. Hvis svaret er «applikasjonen vår legger alltid til riktig filter», er garantien bare like god som den mest utslitte utvikleren som noensinne skrev en spørring.
iKonekt var flerleietaker fra sin første migrering i stedet for ettermontert, noe som høres ut som en skryteh å og egentlig er en innrømmelse: å ettermontere det er nesten umulig å gjøre overbevisende, og alle som har prøvd har en historie.
Adskillelsen bor i databasen. Alle de tjueseks tabellene bærer leietakeren de tilhører, og policyen som sjekker det kjører ved hver lesing og hver skriving, helt under applikasjonen. En spørring som glemmer grensen returnerer ikke noen andres kunder. Den returnerer ingenting.
Sikkerhet på radnivå, påtvunget
Ikke en konvensjon, ikke en kodegjennomgangsregel. Databasen nekter. Syttito policyer, skrevet ut én etter én i stedet for generert – fordi en generert policy er en policy ingen har lest.
Sammensatte nøkler
En underpost refererer til leietakeren sin og forelderen sin sammen, som et par. En feil identifikator fra feil selskap løses ikke – den er rett og slett ikke en gyldig referanse.
Ingen standardleietaker, aldri
En forespørsel uten et omfang blir ikke i det stille en forespørsel om leietaker null. Den kaster en feil før den når databasen. Det finnes ingen «unscoped»-modus å glemme å slå av.
Feilen som ikke kunne melde seg selv
Mens leietakerarbeidet pågikk, var de fleste feilene høylytte. Gi to selskaper samme kundedomene, og databasen protesterer umiddelbart, med en feilkode og et stack trace; du fikser det før lunsj.
Én protesterte ikke. En tabell med redigerbare prompt-overstyringer var nøklet på promptens alene – ikke på alene og leietaker. Et andre selskap som redigerte sin egen kopi ville ha overskrevet det første selskapets i det stille, gjennom helt gyldig SQL, uten feil, uten advarsel og uten en mislykket test. Det ble funnet ved å lese alle gjenværende unike indekser etter endring av en nøkkel, én etter én, i den mistanke om at de høylytte hadde selskap.
Vi nevner det fordi det er den ærlige formen for dette arbeidet. Adskillelse er ikke en funksjon du slår på; det er en vane med å lese de kjedelige delene av skjemaet i antagelse om at noe der inne er uenig med deg.
Testene, for ordens skyld: 942 av dem, kjørt mot en database bygget fra bunnen av ved hver endring. De er ikke der for å bevise at designet er smart. De er der fordi feilmodusen for akkurat dette designet er stille, og stille feil trenger noen som roper på deres vegne.
Hva adskillelse gir en vanlig person
- En gruppe kan drive flere selskaper fra én installasjon, og en selger i det ene vil aldri se en kunde fra det andre – ikke som policy, men ved konstruksjon.
- Et partnerprogram, et sett med prompter, et krav på en kunde: alt med omfang per selskap, slik at én leietakers konfigurasjon ikke kan bli alles.
- En sletterettighetsforespørsel blir imøtekommet innenfor en grense, ikke på tvers av en delt haug – det er dette som gjør det mulig å svare ærlig.
- Og ingen trenger å huske noe av det. Det er poenget – et løfte som avhenger av at noen husker det, er ikke et løfte.
Enda en linje som ikke handler om databaser
Hver søstertjeneste i familien har sitt eget navngitte identitetsbevis. Ingenting snakker med et delt bevis, så ingen tjeneste kan ved et uhell opptre som en annen – en liten disiplin som kom rett fra å ha hatt en delt token og ikke likt det.
Det er samme instinkt som databaseregelen. Gjør det gale umulig i stedet for frarådet, og du bruker oppmerksomheten din på kunder i stedet for på vaksomhet.
- 126 tabellerAlle bærer sin tenant, med kontrollen tvunget på.
- 272 policyerSkrevet ut én for én, slik at hver enkelt er lest av et menneske.
- 3942 testerMot en database bygget opp fra null, ved hver endring.
- 40 standard-tenanterEn forespørsel uten scope når aldri dataene.
Målt på live-bygget

«Applikasjonen vår filtrerer alltid på selskap.»
«Alltid» gjør mye arbeid i den setningen.
Flytt grensen ned i databasen, og en glemt WHERE-klausul gir tomt resultat i stedet for andres kunder. En tom skjerm er en bedre feil enn en kleint introduksjon.
For grupper som driver flere merkevarer →