如何在卡桑德拉中为单词搜索建模



我的模型设计以保存单词搜索复选框,它必须具有更新单词搜索和状态,删除(假)。 我的旧模型集PK是UUID(单词搜索的ID),设置索引是状态(启用,禁用,删除)

但我不想在状态列设置索引(我认为在更新列设置索引非常糟糕),而且我不更改数据库

有更好的建模方法吗?

对不起我的英语语法

不应在非常低的基数列状态上创建索引

避免使用非常低的基数指数,例如非重复值数量非常低的索引。一个很好的例子是用户性别索引。在每个节点上,整个用户群体将仅分布在索引的 2 个不同分区上:MALE 和 FEMALE。如果每个节点的用户数量非常密集(例如数百万),我们将为 MALE 和 FEMALE 索引提供非常宽的分区,这很糟糕。

来源 : https://www.datastax.com/dev/blog/cassandra-native-secondary-index-deep-dive

处理此类情况的最佳方法:

  • 为每种状态类型创建单独的表
  • 或以已知参数(年、月等)作为分区键的状态

第二个选项示例

CREATE TABLE save_search (
year int,
status int,
uuid uuid,
category text,
word_search text,
PRIMARY KEY((year, status), uuid)
);

在这里你可以看到我做了一个带有yearstatus的复合分区键,因为低基数问题。如果您认为大量数据将处于单一状态,则还应该添加月份作为复合分区键的一部分

如果您的数据集很小,您可以删除年份字段。

CREATE TABLE save_search (
status int,
uuid uuid,
category text,
word_search text,
PRIMARY KEY(status, uuid)
);

如果您使用的是 cassandra 3.x 或更高版本,则可以使用物化视图

CREATE MATERIALIZED VIEW search_by_status AS
SELECT *
FROM your_main_table
WHERE uuid IS NOT NULL AND status IS NOT NULL
PRIMARY KEY (status, uuid);

您可以使用如下状态进行查询:

SELECT * FROM search_by_status WHERE status = 0;

您在主表Cassandra上进行的所有删除,更新和插入都将与物化视图同步

最新更新