首页 > 解决方案 > 有效地以多租户格式对数据进行分区。

问题描述

我正在开发一个数据库,该数据库将存储来自多个帐户的产品。给定帐户的产品数量可能会有很大差异,我希望能够轻松查询特定帐户的产品。

目前我有一张类似的桌子。

CREATE TABLE key.products (
    product_id UUID,
    account_id UUID,
    sku TEXT,
    other_details....,
    PRIMARY KEY (account_id, product_id, sku)
);

这个表可以让我很容易地使用这样的查询。

SELECT product_id,sku,other_details FROM key.products WHERE account_id=@@@@;

但是,如果我有少数账户的产品比其他账户多得多,它将抵消 Cassandra 中的分区;而且我的节点之间将不再有良好且平等的数据分布。通过 account_id 查询数据仍然相对容易,但这可以吗?什么时候我会因为不与其他东西分开而自责?以及如何改变我的方法以有效地查询帐户中的产品并最大限度地减少数据偏差?

按 product_id 分区并有一个备用表来按帐户查询会更有效吗?就像是。

CREATE TABLE key.products (
    product_id UUID,
    sku TEXT,
    other_details....,
    PRIMARY KEY (product_id, sku)
);

CREATE TABLE key.products_by_account (
    account_id UUID,
    product_id UUID,
    PRIMARY KEY (account_id, product_id)
);

products_by_account 表中的数据仍然会倾斜,但数据的大小会小得多,因为它不包含主 products 表中的所有数据。这是否更好?

标签: cassandracql

解决方案


Cassandra 中的所有数据建模都围绕查询进行 - 您需要考虑查询的外观......

在您的情况下,良好的分布可能使用复合分区键,例如(account_id, product_id).

另一种方法是向“大”账户添加某种分桶 - 例如,将账户的数据拆分为 N 个桶,并使用 key like (account_id, X),其中 X 介于 0 和 N 之间。在这种情况下,如果您需要要获取给定帐户的所有产品,您可以并行发出 N 个查询以获取所有内容。您可以使用具有固定和已知值集的产品类别或类似的东西来代替数字。


推荐阅读