0

我不是 Cassandra 的绝对专家,但我知道(如果我错了,请纠正我)为数据模型中的所有字段创建二级索引是一种反模式。

我正在使用 Elassandra,我的数据模型如下所示:

  • 代表用户的用户对象,具有:用户 ID、姓名、电话、电子邮件和所有关于用户的信息(假设这些用户在卖东西)
  • 代表用户进行的销售的销售对象,具有:saleID、userID、产品名称、价格等(可以有更多字段)

鉴于我只想对用户的姓名、电子邮件和电话进行复杂的搜索(通过电话搜索、通过电子邮件搜索等),从这个数据模型创建以下 3 个表格是一个好主意:

  • “用户核心”表,仅包含用户 ID、姓名、电话和电子邮件(用于搜索的字段)[在 Elasticsearch 中完全索引和映射的表]
  • 带有用户 ID 的“用户信息”表 + 其他信息 [表未在 Elasticsearch 中建立索引或映射]
  • 包含用户 ID、销售 ID、产品名称、价格等的“销售”表。[表未在 Elasticsearch 中建立索引或映射]

我看到至少一个优势:任何类型的索引(或发生更改时的重新索引)和相关成本只会在“用户核心”表发生更改时发生,该表不应该太频繁地更改。此外,如果我需要获取所有其他信息(用户其他信息或销售),我可以进行 2 个查询:“用户核心”中的 1 个获取用户 ID,另一个表中的 1 个(使用用户 ID)获取另一个数据。

但我不确定这是一个好的模式,或者我不应该担心二级索引而只是索引任何其他表?

以更概括的方式,选择的关键原因是什么 - 像 Elassandra 中的 Elasticsearch 这样的二级索引 - VS - 非规范化表并使用分区和集群键 - ?

请随时询问您是否需要有关我的用例的更多示例。

4

2 回答 2

0

在 Elassandra 的情况下,我不认为 Erick 的回答是完全正确的。本地 Cassandra 查询将优于弹性查询是正确的,在纯 cassandra 中,您应该将表包装在查询周围。

但是,如果您更喜欢灵活性而不是性能(这就是您主要选择使用 elassandra 的原因),您可以使用 cassandra 作为主存储,并受益于 cassandra 的复制性能并索引表以在弹性中进行搜索。

这使您能够在搜索方面保持灵活性,并且仍然确保不会丢失数据,以防弹性方面出现问题。

事实上,在生产环境中,我们将两者结合使用:表具有分区/集群键,并以弹性索引(必要时)。在后端,您可以决定是否可以通过 cassandra 键查询或是否需要弹性。

于 2020-10-28T11:10:48.550 回答
0

使用 Cassandra 时不应规范化。Cassandra 数据建模的最重要方面是为每个应用程序查询设计一个表。换句话说,您应该始终对表进行非规范化。

在为每个查询建模一个表之后,使用 Elassandra 为该表建立索引,其中包含您需要查询的最多列。

需要注意的是,Elassandra 不是灵丹妙药。在很多情况下,如果您已根据应用程序查询正确地对表进行建模,则无需为这些表编制索引。

Elassandra 的用例是利用自由格式文本搜索、分面、提升等功能,但它的性能不如原生表格。事实上,索引查找比直接的单分区 Cassandra 读取需要更多的“步骤”。当然,YMMV 取决于您的用例和访问模式。干杯!

于 2020-10-26T05:11:05.633 回答