有效地以多租户格式对数据进行分区。
Partitioning data in a multi-tenant format efficiently.
我正在开发一个数据库,该数据库将存储来自多个帐户的产品。
给定帐户的产品数量可能会有很大差异,我希望能够轻松查询特定帐户的产品。
目前我有一个与此类似的 table。
CREATE TABLE key.products (
product_id UUID,
account_id UUID,
sku TEXT,
other_details....,
PRIMARY KEY (account_id, product_id, sku)
);
这个 table 让我可以很容易地使用这样的查询。
SELECT product_id,sku,other_details FROM key.products WHERE account_id=@@@@;
但是如果我得到的一些账户比其他账户拥有更多的产品,它会抵消 Cassandra 中的分区;而且我的节点之间将不再有良好且平等的数据分布。通过 account_id 查询数据仍然相对容易,但这可以吗?什么时候我会因为没有与其他东西分区而搬起石头砸自己的脚?
我怎样才能改变我的方法来有效地查询帐户中的产品并最大限度地减少数据偏差?
按 product_id 分区并使用备用 table 按帐户查询是否会更有效?有点像。
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 table 中仍然会倾斜,但数据的大小会小得多,因为它不包含主要产品 table 中的所有数据。这是否更好?
Cassandra 中的所有数据建模都围绕查询进行 - 您需要考虑查询的外观...
在您的情况下,良好的分配可以使用复合分区键,例如 (account_id, product_id)
。
另一种方法是向 "big" 帐户添加某种分桶 - 例如,将帐户的数据拆分为 N 个存储桶,并使用像 (account_id, X)
这样的密钥,其中 X 介于 0 和 N 之间. 在这种情况下,如果您需要获取给定帐户的所有产品,您可以并行发出 N 个查询来获取所有内容。您可以使用具有固定和已知值集的产品类别或类似内容来代替数字。
我正在开发一个数据库,该数据库将存储来自多个帐户的产品。 给定帐户的产品数量可能会有很大差异,我希望能够轻松查询特定帐户的产品。
目前我有一个与此类似的 table。
CREATE TABLE key.products (
product_id UUID,
account_id UUID,
sku TEXT,
other_details....,
PRIMARY KEY (account_id, product_id, sku)
);
这个 table 让我可以很容易地使用这样的查询。
SELECT product_id,sku,other_details FROM key.products WHERE account_id=@@@@;
但是如果我得到的一些账户比其他账户拥有更多的产品,它会抵消 Cassandra 中的分区;而且我的节点之间将不再有良好且平等的数据分布。通过 account_id 查询数据仍然相对容易,但这可以吗?什么时候我会因为没有与其他东西分区而搬起石头砸自己的脚? 我怎样才能改变我的方法来有效地查询帐户中的产品并最大限度地减少数据偏差?
按 product_id 分区并使用备用 table 按帐户查询是否会更有效?有点像。
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 table 中仍然会倾斜,但数据的大小会小得多,因为它不包含主要产品 table 中的所有数据。这是否更好?
Cassandra 中的所有数据建模都围绕查询进行 - 您需要考虑查询的外观...
在您的情况下,良好的分配可以使用复合分区键,例如 (account_id, product_id)
。
另一种方法是向 "big" 帐户添加某种分桶 - 例如,将帐户的数据拆分为 N 个存储桶,并使用像 (account_id, X)
这样的密钥,其中 X 介于 0 和 N 之间. 在这种情况下,如果您需要获取给定帐户的所有产品,您可以并行发出 N 个查询来获取所有内容。您可以使用具有固定和已知值集的产品类别或类似内容来代替数字。