以有效的方式对多租户格式的数据进行分区。

时间:2018-05-29 16:24:32

标签: cassandra cql

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

目前我有一张类似的表。

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表中产生偏差,但数据的大小会小得多,因为它不包含主产品表中的所有数据。这是否更好?

1 个答案:

答案 0 :(得分:1)

Cassandra中的所有数据建模都发生在查询周围 - 您需要考虑查询的外观......

在您的情况下,良好的分发可以使用复合分区键,如(account_id, product_id)

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