Существует два подхода, которые можно использовать для предварительного объединения в мультитенантных средах.
- Переопределить
sql
для каждого клиентского куба, например OrdersC1
, OrdersC2
и т. Д. c. В этом случае все предварительные агрегаты, определенные в базовом кубе Orders
, будут наследоваться. Каждый клиентский куб будет иметь свой собственный набор предварительных агрегаций. Это означает, что если есть N
клиентов и M
предварительных агрегаций, то должны быть построены N * M
таблицы предварительной агрегации, что может быть дорогостоящим в некоторых случаях ios.
cube(`Orders`, {
sql: `SELECT * FROM orders`,
preAggregations: {
date: {
type: `rollup`,
measureReferences: [someMeasure],
dimensionReferences: [someDimension],
timeDimensionReference: date,
granularity: `month`
},
// ...
}
});
cube(`OrdersC1`, {
extends: Orders,
sql: `SELECT * FROM orders WHERE customer_id = 'C1'`,
});
Использовать поле арендатора в качестве измерения свертки. Каждый сегмент может быть преобразован в измерение, что дает возможность использовать единую сводную таблицу для всех клиентов. Для маршрутизации запросов к нужным данным арендатора можно использовать
queryTransformer .
cube(`Orders`, {
sql: `SELECT * FROM orders`,
// ...
dimensions: {
// ...
customerId: {
sql: `customer_id`,
type: `string`
}
},
preAggregations: {
date: {
type: `rollup`,
measureReferences: [someMeasure],
dimensionReferences: [customerId, someDimension],
timeDimensionReference: date,
granularity: `month`
},
// ...
}
});