Cassandra的数据建模简易表无法正常工作

时间:2015-12-03 21:56:50

标签: cassandra cassandra-2.0 cql3

我必须设计一个网页,组长可以邀请其他人加入他/她的小组。我的要求非常简单。

  1. 如果已联系过此人,则不会发送重复的电子邮件。

  2. 向组长显示按邀请日期按升序排序的邀请列表。

  3. 似乎很容易。我创建了这个表。

    CREATE TABLE invites (
    email_address text,
    invite_date timeuuid,
    PRIMARY KEY (email_address, invite_date)
    ) WITH CLUSTERING ORDER BY (invite_date ASC);
    

    问题1:LWT不能将invite_date用作群集列。

    我认为我会使用LWT来确保email_address是唯一的,只是为了找出IF NOT EXISTS似乎只能在整个 PRIMARY KEY上工作,所以C *中的LWT对我不起作用。

    问题2:即使将invite_date作为群集列,我也无法获得有序的邀请列表以保存我的生命。

    如果我将invite_date取出,我不能在CQL中发出'order by'。也就是说,让allowed_date离开PK让我使用LWT ......

    我甚至无法获得2列表来满足2个简单的要求!非常感谢任何有关此问题的数据建模设计方面的帮助。

    新2015年12月4日:

    除业务要求外,我的技术要求是: 我想确保我在Cassandra中正确建模,以便它允许我在Java驱动程序中使用CQL的LIMIT和pagingState功能。这意味着,我不能只读取所有行,在Java端排序并返回结果。

2 个答案:

答案 0 :(得分:1)

问题1: 我认为处理这个的最简单方法可能是有两个单独的表,一个用于emails_in_group,另一个用于invites_by_group。这将允许每个查询独立完成。 emails_in_group表看起来像这样:

CREATE TABLE emails_in_group ( 
 email_address text,  
 group_id text,
 PRIMARY KEY (email_address , group_id));  

然后,结合下面问题2中定义的表,可以使用条件批处理语句进行更新,如下所示: http://docs.datastax.com/en/cql/3.1/cql/cql_using/use-batch-static.html

问题2: 因此,这里的基本问题是,当您的数据当前建模时,每个email_address值将在其自己的分区中,然后在该分区内将订购invite_date。 @bydsky是正确的,他说你需要在你的表中添加类似group_id的东西,并将其作为主键的分区键部分。如果执行此操作,然后将invite_date作为群集列添加到分区键,则该group_id的所有记录将存储在同一分区中,并且Order By将起作用。 Order By仅在同一个partiton中工作,而不是在您要求它执行的分区之间。

CREATE TABLE invites_by_group ( 
 group_id text,  
 email_address text,  
 invite_date timestamp,  
 PRIMARY KEY (group_id, invite_date));   

答案 1 :(得分:0)

我认为您应该使用group_id和电子邮件作为主键。

对于订购,也许您可​​以在您的应用程序中完成。

CREATE TABLE invites ( group_id text,  
email_address text,  
invite_date timestamp,  
PRIMARY KEY (group_id, email_address) );   

对于cassandra数据建模,它是一个良好的开端,DS220