Comparteix a través de


Modelado de aplicaciones SaaS multiinquilino en Azure Cosmos DB for PostgreSQL

SE APLICA A: Azure Cosmos DB for PostgreSQL (con tecnología de la extensión de base de datos de Citus en PostgreSQL)

Id. de inquilino como clave de partición

El id. de inquilino es la columna en la raíz de la carga de trabajo o la parte superior de la jerarquía del modelo de datos. Por ejemplo, en este esquema de comercio electrónico de SaaS, sería el id. de la tienda:

Diagrama de las tablas con la columna store_id resaltada.

Este modelo de datos sería el típico para un negocio como Shopify. Hospeda sitios para varias tiendas en línea y cada tienda interactúa con sus propios datos.

  • Este modelo de datos tiene una serie de tablas: tiendas, productos, pedidos, artículos de línea y países.
  • La tabla de tiendas está en la parte superior de la jerarquía. Los productos, los pedidos y los elementos de línea están asociados a tiendas y, por lo tanto, se sitúan debajo en la jerarquía.
  • La tabla de países no está relacionada con tiendas individuales, se encuentra entre las tiendas.

En este ejemplo, store_id, que se encuentra en la parte superior de la jerarquía, es el identificador del inquilino. Es la clave de partición correcta. Seleccionar store_id como clave de partición permite coubicar datos en todas las tablas de una única tienda en un único trabajo.

La coubicación de tablas por tiendas supone ventajas:

  • Proporciona cobertura SQL, como claves externas y operaciones JOIN. Las transacciones de un solo inquilino se encuentran en un único nodo de trabajo, donde existe cada inquilino.
  • Logra un rendimiento de milisegundos de un solo dígito. Las consultas de un solo inquilino se enrutan a un solo nodo en lugar de paralelizarse, lo que ayuda a optimizar los saltos de red y a escalar el proceso y la memoria.
  • Se escala. A medida que crece el número de inquilinos, puede agregar nodos y reequilibrar los inquilinos a nuevos nodos, o incluso aislar inquilinos grandes en sus propios nodos. El aislamiento de inquilinos permite proporcionar recursos dedicados.

Diagrama de las tablas colocadas en los mismos nodos.

Modelo de datos óptimo para aplicaciones multiinquilino

En este ejemplo, debemos distribuir las tablas específicas de cada tienda por id. de tienda y convertir countries en tabla de referencia.

Diagrama de las tablas con store_id resaltado en general.

Fíjese que las tablas específicas del inquilino tienen el id. de inquilino y se distribuyen. En nuestro ejemplo, se distribuyen las tablas stores, products y line_items. El resto de las tablas son tablas de referencia. En nuestro ejemplo, la tabla de países es una tabla de referencia.

-- 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');

Todas las tablas grandes deben tener el id. de inquilino.

  • Si va a migrar una aplicación multiinquilino existente a Azure Cosmos DB for PostgreSQL, es posible que tenga que desnormalizar un poco y agregar la columna de id. de inquilino a las tablas grandes si falta y luego reponen los valores que faltan de la columna.
  • Para las nuevas aplicaciones en Azure Cosmos DB for PostgreSQL, asegúrese de que el id. de inquilino esté presente en todas las tablas específicas del inquilino.

Asegúrese de incluir el id. de inquilino en las restricciones de clave principal, única y externa en las tablas distribuidas en forma de clave compuesta. Por ejemplo, si una tabla tiene la clave principal id, conviértala a la clave compuesta (tenant_id,id). No es necesario cambiar las claves de las tablas de referencia.

Consideraciones de consulta para obtener el mejor rendimiento

Las consultas distribuidas que filtran por el id. de inquilino se ejecutan de forma más eficiente en aplicaciones multiinquilino. Asegúrese de que las consultas siempre tengan como ámbito un solo inquilino.

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

Es necesario agregar el filtro de id. de inquilino incluso si las condiciones de filtro originales identifican inequívocamente las filas que le interesan. El filtro de id. de inquilino, aunque parezca redundante, indica a Azure Cosmos DB for PostgreSQL cómo enrutar la consulta a un único nodo de trabajo.

De forma similar, al unir dos tablas distribuidas, asegúrese de que ambas tablas tengan como ámbito un único inquilino. Se puede definir el ámbito asegurándose de que las condiciones de combinación incluyan el id. de inquilino.

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

Hay bibliotecas auxiliares para varios marcos de aplicaciones populares que facilitan la inclusión de un id. de inquilino en las consultas. Consulte las instrucciones siguientes:

Pasos siguientes

Ya hemos terminado de explorar el modelado de datos para las aplicaciones escalables. El siguiente paso es conectar y consultar la base de datos con su lenguaje de programación favorito.