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:
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.
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.
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.
Comentaris
https://aka.ms/ContentUserFeedback.
Properament: al llarg del 2024 eliminarem gradualment GitHub Issues com a mecanisme de retroalimentació del contingut i el substituirem per un nou sistema de retroalimentació. Per obtenir més informació, consulteu:Envieu i consulteu els comentaris de