iKonekt
Otwórz konsolę

Rozdzielenie

Granica,
której pilnuje baza, a nie kod

Każdy CRM twierdzi, że jest wielofirmowy. Twierdzenie jest tanie; liczy się to, która warstwa trzyma linię. Jeśli odpowiedź brzmi „nasza aplikacja zawsze dokłada właściwy filtr”, to gwarancja jest warta tyle, co najbardziej niewyspany programista, który kiedykolwiek napisał tu zapytanie.

iKonekt był wielofirmowy od pierwszej migracji, a nie doklejono mu tego później — co brzmi jak przechwałka, a jest w istocie przyznaniem się: doklejenie tego w sposób przekonujący jest bliskie niemożliwego, a każdy, kto próbował, ma na ten temat historię.

Rozdzielenie mieszka w bazie danych. Każda z dwudziestu sześciu tabel nosi firmę, do której należy, a reguła, która to sprawdza, uruchamia się przy każdym odczycie i każdym zapisie, całkowicie poniżej aplikacji. Zapytanie, które zapomni o granicy, nie zwraca cudzych klientów. Nie zwraca nic.

Reguły na poziomie wiersza, wymuszone

Nie konwencja, nie zasada z code review. Baza odmawia. Siedemdziesiąt dwie reguły, wypisane pojedynczo, a nie wygenerowane — bo reguła wygenerowana to reguła, której nikt nie przeczytał.

Klucze złożone

Rekord podrzędny wskazuje swoją firmę i swojego rodzica razem, jako parę. Przypadkowy identyfikator z innej firmy się nie rozwiązuje — po prostu nie jest poprawnym odwołaniem.

Nigdy żadnej firmy domyślnej

Żądanie bez kontekstu nie staje się po cichu żądaniem firmy zerowej. Rzuca wyjątkiem, zanim dotrze do bazy. Nie ma trybu „bez zakresu”, o którego wyłączeniu można zapomnieć.

Błąd, który nie potrafił się zgłosić

W trakcie prac nad wielofirmowością większość pomyłek była głośna. Daj dwóm firmom tę samą domenę klienta, a baza protestuje natychmiast, z kodem błędu i śladem stosu; poprawiasz przed obiadem.

Jedna nie zaprotestowała. Tabela edytowalnych nadpisań promptów miała klucz oparty wyłącznie na rodzaju promptu — nie na rodzaju i firmie. Druga firma, edytując własną kopię, po cichu nadpisałaby kopię pierwszej, całkowicie poprawnym SQL-em, bez błędu, bez ostrzeżenia i bez nieprzechodzącego testu. Znaleziono to, czytając po kolei każdy pozostały indeks unikalny po zmianie klucza, w przeczuciu, że te głośne mają towarzystwo.

Wspominamy o tym, bo taki jest uczciwy kształt tej roboty. Rozdzielenie nie jest funkcją, którą się włącza; jest nawykiem czytania nudnych fragmentów schematu przy założeniu, że coś w nich się z Tobą nie zgadza.

Testy, dla porządku: jest ich 942 i uruchamiają się przy każdej zmianie na bazie odbudowanej od zera. Nie są po to, żeby udowodnić, że projekt jest sprytny. Są po to, że tryb awarii tego akurat projektu jest cichy, a ciche awarie potrzebują kogoś, kto krzyknie w ich imieniu.

Co rozdzielenie daje zwykłemu człowiekowi

  • Grupa może prowadzić kilka spółek z jednej instalacji, a handlowiec jednej nigdy nie zobaczy klienta drugiej — nie z powodu polityki, tylko z konstrukcji.
  • Program partnerski, zestaw promptów, zgłoszenie do klienta: wszystko liczone per firma, więc konfiguracja jednego najemcy nie staje się konfiguracją wszystkich.
  • Żądanie usunięcia danych jest honorowane wewnątrz granicy, a nie w jednej wspólnej stercie — i to właśnie pozwala odpowiedzieć na nie uczciwie.
  • I nikt nie musi o tym wszystkim pamiętać. O to chodzi — gwarancja, która zależy od pamiętania, nie jest gwarancją.

Jeszcze jedno zdanie, nie o bazach danych

Każda usługa siostrzana w rodzinie ma własne nazwane poświadczenie. Nic nie mówi wspólnym, więc żadna usługa nie może przypadkiem wystąpić jako inna — drobna dyscyplina, która wzięła się wprost z posiadania kiedyś wspólnego tokena i z niecieszenia się tym.

To ten sam instynkt co reguła w bazie. Uczyń złą rzecz niemożliwą, zamiast niezalecaną, a uwagę wydasz na klientów, nie na czujność.

GranicaPoniżej aplikacji
  • 126 tabelKażda nosi swoją firmę, z wymuszonym sprawdzeniem.
  • 272 regułyWypisane pojedynczo, więc każdą przeczytał człowiek.
  • 3942 testyNa bazie odbudowanej od zera, przy każdej zmianie.
  • 40 firm domyślnychŻądanie bez zakresu nigdy nie dociera do danych.

Zmierzone na działającej wersji

„Nasza aplikacja zawsze filtruje po firmie.”

Słowo „zawsze” dźwiga w tym zdaniu bardzo dużo.

Przesuń granicę do bazy danych, a zapomniana klauzula WHERE zwróci nic zamiast cudzych klientów. Pusty ekran to lepsza awaria niż niezręczne przedstawienie.

Dla grup z wieloma markami →