Cassandra 定义主键和备选方案

Cassandra Defining Primary key and alternatives

这里是cassandra中用户table的一个简单例子。创建主键的最佳策略是什么。

我的要求是

  1. 按 uuid 搜索
  2. 按用户名搜索
  3. 通过电子邮件搜索

提到的所有键都是高基数键。另外在任何时候我都只会搜索其中一个

主键(uid、用户名、电子邮件)

如果我只有用户名怎么办?,那么上面的主键是没有用的。我无法想象使用复合主键实现此目的的解决方案?

还有哪些其他选择?我们是否应该使用用户名为 uid 的新 table,然后搜索用户 table。 ?

互联网上的所有文章都建议不要为高基数键创建二级索引

CREATE TABLE medicscity.user (
    uid uuid,
    fname text,
    lname text,
    user_id text,
    email_id text,
    password text,
    city text,
    state_id int,
    country_id int,
    dob timestamp,
    zipcode text,
    PRIMARY KEY (??)
) 

我们如何解决这种情况?

是的,您需要重复 tables。

如果您在 Cassandra 中遇到过这样的情况,您将不得不根据 column1、column2 或 column3 独立查询 table。您将必须复制 tables.

现在,你必须使用多少重复,是个人选择。

例如,在此示例中,您可以使用完整数据复制 table。 或者,您可以简单地在 main table 中创建一个新的 table column1(分区)、column2、column 3 作为主键。 使用 column1、column2、column3 的主键和 column2 上的分区键创建一个新的 table。 另一个在 column3 上具有相同的主键和分区键。

因此,您的数据重复将是行,但在这种情况下,您最终将查询数据两次。一份来自重复 table,一份来自完整 table.

大数据技术,是不是可以加速计算,让你的系统水平扩展,它是以disk/storage为代价的。我的意思是只看一切,甚至它的复制因子基础也会重复数据。

您的PRIMARY KEY(uuid,username,email)不符合您的要求。因为不填Partition Key就不能搜索聚簇列,不填第一个聚簇列就搜不到第二个聚簇列。

例如您不能在 WHERE 子句中搜索没有 uuid 的用户名,也不能搜索没有 uuid 和用户名的电子邮件。

您只需要反规范化和重复数据。

Denormalization and duplication of data is a fact of life with Cassandra. Don’t be afraid of it. Disk space is generally the cheapest resource (compared to CPU, memory, disk IOPs, or network), and Cassandra is architected around that fact. In order to get the most efficient reads, you often need to duplicate data.

在您的情况下,您需要创建 3 个具有相同列(您想要获取的数据)的表,但这 3 个表将具有不同的 PRIMARY KEY,一个具有 uuid 作为 PK,一个具有 username 作为 PK , 一个有电子邮件作为 PK。 :)