Ydeevnen er ikke dårligere, nødvendigvis. Som artiklen forklarer, er der specifikke forhold, der gør skematilgangen bedre eller dårligere afhængigt af dit applikationsdesign og arbejdsbyrde. Lad mig forklare afvejningen mellem "lejer-skema" versus "delt-bord"-tilgange:
lejer-skema er bedst, når du har et relativt lille antal ret store lejere. Et eksempel på dette ville være en regnskabsapplikation med kun betalte abonnementsbrugere. Ting, der gør det til den bedste mulighed for dig, omfatter:
- et lille antal lejere med mange data hver
- et relativt simpelt skema uden mange tabeller pr. lejer
- et behov for at tilpasse skemaerne for nogle lejere
- mulighed for at gøre brug af databaseroller pr. lejer
- krav om at migrere en lejers data fra en server til en anden
- mulighed for at oprette en dedikeret appserver i din sky for hver lejer
Ting, der gør det til en dårligt ydende mulighed inkluderer:
- masser af lejere med meget få data hver
- statsløs tilgang til forbindelser, hvor hver anmodning kunne være en hvilken som helst lejer
- klientbibliotek eller orm, som cacher metadata for alle tabeller (såsom ActiveRecord)
- et krav om effektiv, højtydende forbindelsespooling og/eller caching
- problemer med VACUUM og andre PostgreSQL administrative operationer, som skaleres dårligt på tværs af 1000-vis af tabeller.
Hvorvidt lejer-skema er dårligt til migreringer/skemaændringer afhænger virkelig af, hvordan du gør dem. Det er dårligt til hurtigt at udrulle en universel skemaændring, men god til at implementere skemaændringer som en gradvis udrulning på tværs af lejere.
delt bord fungerer bedre til situationer, hvor du har mange lejere, og mange af dine lejere har meget lidt data. Et eksempel på dette ville være en social medie-mobilapplikation, som tillader gratis konti og dermed har tusindvis af forladte konti. Andre ting, der gør den delte bord-model fordelagtig, er:
- bedre til forbindelsespooling, da alle forbindelser kan bruge den samme pool
- bedre for PostgreSQL-administration på grund af færre tabeller i alt
- bedre til migreringer og skemaændringer, da der kun er ét "sæt" tabeller
Den største ulempe ved delt tabel er behovet for at tilføje lejerfilterbetingelsen til hver enkelt forespørgsel i applikationslaget. Det er også problematisk, fordi:
- forespørgsler, der forbinder mange tabeller, kan fungere dårligt, fordi lejerfilteret afslører forespørgselsplanlægning
- tabeller, der vokser til 100 millioner rækker, kan forårsage specifikke problemer med ydeevne og vedligeholdelse
- ingen måde at foretage lejerspecifikke applikationsændringer eller skemaopgraderinger
- dyrere at migrere lejere mellem servere
Så hvilken model "performer bedre" afhænger virkelig af, hvilke afvejninger der skader dig værst.
Der er også en hybridmodel, "tenant-view", hvor de faktiske data gemmes i delte tabeller, men hver applikationsforbindelse bruger visninger af sikkerhedsbarrierer for at se dataene. Dette har nogle af kompromiserne ved hver model. Primært har den sikkerhedsfordelene ved lejerskemamodellen med nogle af ydeevnemanglerne ved begge modeller.