我的模型设计以保存单词搜索复选框,它必须具有更新单词搜索和状态,删除(假)。 我的旧模型集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)
);
在这里你可以看到我做了一个带有year
和status
的复合分区键,因为低基数问题。如果您认为大量数据将处于单一状态,则还应该添加月份作为复合分区键的一部分
如果您的数据集很小,您可以删除年份字段。
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上进行的所有删除,更新和插入都将与物化视图同步