iKonekt

Separación

A fronteira que mantén a base de datos, non o código

Todo CRM afirma ser multiinquilino. A afirmación é barata; o que importa é que capa sostén a liña. Se a resposta é «a nosa aplicación engade sempre o filtro correcto», entón a garantía vale tanto como o desenvolvedor menos descansado que escribiu unha consulta.

iKonekt foi multiinquilino desde a súa primeira migración e non adaptado despois, o que soa a presumencia e en realidade é unha admisión: adaptalo despois é case imposible de facer de xeito convincente, e todos os que o tentaron teñen unha historia.

A separación vive na base de datos. Cada unha das vinte e seis táboas leva o inquilino ao que pertence, e a política que o comproba execútase en cada lectura e en cada escritura, completamente por debaixo da aplicación. Unha consulta que esquece a fronteira non devolve os clientes doutro. Non devolve nada.

Seguridade a nivel de fila, forzada

Non é unha convención, nin unha regra de revisión de código. A base de datos négase. Setenta e dúas políticas, escritas unha a unha en vez de xeradas, porque unha política xerada é unha política que ninguén leu.

Claves compostas

Un rexistro fillo referencia o seu inquilino e o seu pai xuntos, como parella. Un identificador perdido da empresa equivocada non se resolve: simplemente non é unha referencia válida.

Ningún inquilino por defecto, nunca

Unha petición sen ámbito non se converte silenciosamente nunha petición para o inquilino cero. Lanza un erro antes de chegar á base de datos. Non hai un modo «sen ámbito» que se poida esquecer de desactivar.

O erro que non podía anunciarse

Mentres se facía o traballo de multiinquilino, a maioría dos erros eran ruidosos. Dá a dúas empresas o mesmo dominio de cliente e a base de datos obxecta inmediatamente, cun código de erro e unha traza de pila; arránxao antes da comida.

Ninguén obxectou. Unha táboa de substitucións de prompts editables estaba indexada só polo tipo do prompt — non por tipo e arrendatario. Unha segunda empresa que editase a súa propia copia tería sobrescrito en silencio a da primeira, con SQL totalmente válido, sen erro, sen aviso e sen ningún test que fallase. Atopouse lendo todos os índices únicos restantes tras cambiar unha clave, un por un, coa sospeita de que os ruidosos non estaban sós.

Mencionámolo porque é a forma honesta deste traballo. A separación non é unha funcionalidade que se activa; é o hábito de ler as partes aburridas do esquema asumindo que algo alí non está de acordo contigo.

Os tests, para que conste: 942, executados contra unha base de datos reconstruída desde cero en cada cambio. Non están aí para demostrar que o deseño é intelixente. Están aí porque o modo de fallo deste deseño concreto é silencioso, e os fallos silenciosos necesitan alguén que grite no seu nome.

O que a separación lle achega a unha persoa normal

  • Un grupo pode xestionar varias empresas desde unha soa instalación, e un vendedor dunha nunca verá un cliente doutra — non por política, senón por construción.
  • Un programa de socios, un conxunto de prompts, unha reclamación sobre un cliente: todo con ámbito por empresa, así a configuración dun arrendatario non pode converterse na de todos.
  • Unha solicitude de supresión aténdese dentro dun límite en vez de nun montón compartido, e iso é o que fai posible responder con honestidade.
  • E ninguén ten que lembrar nada disto. Ese é o punto — unha garantía que depende de que se lembre non é unha garantía.

Unha liña máis que non vai de bases de datos

Cada servizo irmán da familia ten a súa propia credencial con nome. Ninguén fala cunha compartida, así ningún servizo pode actuar accidentalmente como outro — unha pequena disciplina que veu directamente de ter tido un token compartido e non gozalo.

É o mesmo instinto que a regra da base de datos. Fai que o incorrecto sexa imposible en vez de desaconsellable, e dedicarás a túa atención aos clientes en vez de á vixilancia.

O límitePor debaixo da aplicación
  • 126 táboasCada unha leva o seu arrendatario, coa comprobación forzada.
  • 272 políticasEscritas unha por unha, así cada unha foi lida por unha persoa.
  • 3942 probasContra unha base de datos reconstruída desde cero, en cada cambio.
  • 40 arrendatarios por defectoUnha solicitude sen ámbito nunca chega aos datos.

Medido na compilación en vivo

«A nosa aplicación sempre filtra por empresa.»

«Sempre» está a facer moito traballo nesa frase.

Move o límite cara a abaixo, ata a base de datos, e unha cláusula WHERE esquecida devolve nada en vez dos clientes doutro. Unha pantalla baleira é un fallo mellor que unha presentación incómoda.

Para grupos con varias marcas →