Dela via


Modellera SaaS-appar för flera innehavare i Azure Cosmos DB för PostgreSQL

GÄLLER FÖR: Azure Cosmos DB for PostgreSQL (drivs av Citus-databastillägget till PostgreSQL)

Klientorganisations-ID som shardnyckel

Klientorganisations-ID:t är kolumnen i arbetsbelastningens rot eller överst i hierarkin i datamodellen. I det här SaaS-e-handelsschemat skulle det till exempel vara butiks-ID:t:

Diagram över tabeller med kolumnen store_id markerad.

Den här datamodellen skulle vara typisk för ett företag som Shopify. Den är värd för webbplatser för flera onlinebutiker, där varje butik interagerar med sina egna data.

  • Den här datamodellen har en massa tabeller: butiker, produkter, beställningar, radobjekt och länder.
  • Tabellen stores finns överst i hierarkin. Produkter, order och radobjekt är alla associerade med butiker, vilket är lägre i hierarkin.
  • Tabellen länder är inte relaterad till enskilda butiker, den är bland alla butiker.

I det här exemplet store_id, som finns överst i hierarkin, är identifieraren för klientorganisationen. Det är rätt shardnyckel. Genom att välja store_id som shardnyckel kan du samla in data i alla tabeller för ett enda lager på en enda arbetare.

Att hitta tabeller efter butik har fördelar:

  • Tillhandahåller SQL-täckning, till exempel sekundärnycklar, JOIN. Transaktioner för en enskild klientorganisation lokaliseras på en enda arbetsnod där varje klient finns.
  • Uppnår ensiffriga millisekunders prestanda. Frågor för en enskild klientorganisation dirigeras till en enskild nod i stället för att parallelliseras, vilket hjälper till att optimera nätverkshopp och fortfarande skala beräkning/minne.
  • Den skalar. När antalet klienter växer kan du lägga till noder och balansera om klientorganisationer till nya noder, eller till och med isolera stora klienter till sina egna noder. Med klientisolering kan du tillhandahålla dedikerade resurser.

Diagram över tabeller som samlokaliserats till samma noder.

Optimal datamodell för appar med flera klientorganisationer

I det här exemplet bör vi distribuera de butiksspecifika tabellerna efter butiks-ID och skapa countries en referenstabell.

Diagram över tabeller med store_id mer universellt markerat.

Observera att klientspecifika tabeller har klientorganisations-ID och distribueras. I vårt exempel distribueras butiker, produkter och line_items. Resten av tabellerna är referenstabeller. I vårt exempel är tabellen länder en referenstabell.

-- Distribute large tables by the tenant ID

SELECT create_distributed_table('stores', 'store_id');
SELECT create_distributed_table('products', 'store_id', colocate_with => 'stores');
-- etc for the rest of the tenant tables...

-- Then, make "countries" a reference table, with a synchronized copy of the
-- table maintained on every worker node

SELECT create_reference_table('countries');

Stora tabeller bör alla ha klientorganisations-ID:t.

  • Om du migrerar en befintlig app för flera klientorganisationer till Azure Cosmos DB för PostgreSQL kan du behöva avnormalisera lite och lägga till kolumnen klient-ID i stora tabeller om den saknas och sedan fylla på de saknade värdena i kolumnen.
  • För nya appar i Azure Cosmos DB för PostgreSQL kontrollerar du att klientorganisations-ID:t finns i alla klientspecifika tabeller.

Se till att inkludera klientorganisations-ID för primära, unika och sekundärnyckelbegränsningar i distribuerade tabeller i form av en sammansatt nyckel. Om en tabell till exempel har en primärnyckel på id, omvandlar du den till den sammansatta nyckeln (tenant_id,id). Du behöver inte ändra nycklar för referenstabeller.

Frågeöverväganden för bästa prestanda

Distribuerade frågor som filtrerar på klientorganisations-ID:t körs mest effektivt i appar för flera klientorganisationer. Se till att dina frågor alltid är begränsade till en enda klientorganisation.

SELECT *
  FROM orders
 WHERE order_id = 123
   AND store_id = 42;  -- ← tenant ID filter

Det är nödvändigt att lägga till klient-ID-filtret även om de ursprungliga filtervillkoren entydigt identifierar de rader du vill ha. Klient-ID-filtret, även om det är till synes redundant, talar om för Azure Cosmos DB for PostgreSQL hur frågan dirigeras till en enda arbetsnod.

När du ansluter till två distribuerade tabeller ser du på samma sätt till att båda tabellerna är begränsade till en enda klientorganisation. Omfång kan göras genom att se till att kopplingsvillkoren inkluderar klientorganisations-ID:t.

SELECT sum(l.quantity)
  FROM line_items l
 INNER JOIN products p
    ON l.product_id = p.product_id
   AND l.store_id = p.store_id   -- ← tenant ID in join
 WHERE p.name='Awesome Wool Pants'
   AND l.store_id='8c69aa0d-3f13-4440-86ca-443566c1fc75';
       -- ↑ tenant ID filter

Det finns hjälpbibliotek för flera populära programramverk som gör det enkelt att inkludera ett klient-ID i frågor. Här följer instruktioner:

Nästa steg

Nu har vi utforskat datamodellering för skalbara appar. Nästa steg är att ansluta och fråga databasen med valfritt programmeringsspråk.