cassandra - 有效地以多租户格式对数据进行分区。
问题描述
我正在开发一个数据库,该数据库将存储来自多个帐户的产品。给定帐户的产品数量可能会有很大差异,我希望能够轻松查询特定帐户的产品。
目前我有一张类似的桌子。
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 表中的所有数据。这是否更好?
解决方案
Cassandra 中的所有数据建模都围绕查询进行 - 您需要考虑查询的外观......
在您的情况下,良好的分布可能使用复合分区键,例如(account_id, product_id)
.
另一种方法是向“大”账户添加某种分桶 - 例如,将账户的数据拆分为 N 个桶,并使用 key like (account_id, X)
,其中 X 介于 0 和 N 之间。在这种情况下,如果您需要要获取给定帐户的所有产品,您可以并行发出 N 个查询以获取所有内容。您可以使用具有固定和已知值集的产品类别或类似的东西来代替数字。
推荐阅读
- cmake - 如果安装了新版本,为什么仍然使用旧版本的 cmake?
- c - 关于递归转置密码对任意长度字符串的推广
- javascript - 用户保存图像后 Safari 重新加载页面
- javascript - 使用 Cypress.io 对我自己的 Node 模块进行单元测试时出错
- python - Python Pandas:用三个不同的值在数据框中创建一列
- html - 避免画布元素上的分页符
- python - 在不知道要删除的列表的情况下从给定列表中删除列表
- java - 禁用 CSS 时,HTMLUnit 不会执行 JavaScript 并加载所有内容
- python - 如何解析python代码并且只获取没有缩进的变量?
- git - 找到更改量最少的提交