我不是 Cassandra 的绝对专家,但我知道(如果我错了,请纠正我)为数据模型中的所有字段创建二级索引是一种反模式。
我正在使用 Elassandra,我的数据模型如下所示:
- 代表用户的用户对象,具有:用户 ID、姓名、电话、电子邮件和所有关于用户的信息(假设这些用户在卖东西)
- 代表用户进行的销售的销售对象,具有:saleID、userID、产品名称、价格等(可以有更多字段)
鉴于我只想对用户的姓名、电子邮件和电话进行复杂的搜索(通过电话搜索、通过电子邮件搜索等),从这个数据模型创建以下 3 个表格是一个好主意:
- “用户核心”表,仅包含用户 ID、姓名、电话和电子邮件(用于搜索的字段)[在 Elasticsearch 中完全索引和映射的表]
- 带有用户 ID 的“用户信息”表 + 其他信息 [表未在 Elasticsearch 中建立索引或映射]
- 包含用户 ID、销售 ID、产品名称、价格等的“销售”表。[表未在 Elasticsearch 中建立索引或映射]
我看到至少一个优势:任何类型的索引(或发生更改时的重新索引)和相关成本只会在“用户核心”表发生更改时发生,该表不应该太频繁地更改。此外,如果我需要获取所有其他信息(用户其他信息或销售),我可以进行 2 个查询:“用户核心”中的 1 个获取用户 ID,另一个表中的 1 个(使用用户 ID)获取另一个数据。
但我不确定这是一个好的模式,或者我不应该担心二级索引而只是索引任何其他表?
以更概括的方式,选择的关键原因是什么 - 像 Elassandra 中的 Elasticsearch 这样的二级索引 - VS - 非规范化表并使用分区和集群键 - ?
请随时询问您是否需要有关我的用例的更多示例。