Cassandra定义主键和替代品

时间:2016-04-03 03:21:03

标签: cassandra datastax

以下是cassandra中用户表的简单示例。什么是创建主键的最佳策略。

我的要求是

  1. uuid搜索
  2. 按用户名搜索
  3. 通过电子邮件搜索
  4. 提到的所有密钥都是高基数密钥。此外,在任何时候我都只会搜索其中一个

    PRIMARY KEY(uid,用户名,电子邮件)

    如果我只有用户名怎么办?,那么上面的主键就不用了。我无法使用复合主键可视化解决方案吗?

    还有什么其他选择?我们应该使用带有uid用户名的新表,然后搜索用户表。 ?

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

    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 (??)
    ) 
    

    我们如何解决这种情况?

2 个答案:

答案 0 :(得分:1)

是的,您需要使用重复的表格。

如果曾经在Cassandra中遇到过必须独立查询基于column1,column2或column3的表的情况。您将不得不复制表格。

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

在本例中,您可以使用完整数据复制表。 或者,您只需在主表中创建一个新表column1(partition),column2,column 3作为主键。 创建一个新表,其主键为column1,column2,column3和column2上的分区键。 另一个在column3上具有相同的主键和分区键。

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

大数据技术,是为了加快计算速度,让你的系统水平扩展,它以磁盘/存储为代价。我的意思是只看一切,即使它的复制因素基础也会重复数据。

答案 1 :(得分:1)

您的PRIMARY KEY(uuid,username,email)不符合您的要求。因为您无法在不填充分区键的情况下搜索群集列,甚至无法填充第一个群集列的第二个群集列。

e.g。你不能在WHERE子句中搜索没有uuid的用户名,也不能在没有uuid和用户名的情况下搜索电子邮件。

您需要的只是非规范化和重复数据。

  

数据的非规范化和重复是Cassandra的事实。不要害怕它。磁盘空间通常是最便宜的资源(与CPU,内存,磁盘IOP或网络相比),而Cassandra则围绕这一事实进行架构。为了获得最有效的读取,您通常需要复制数据。

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