我必须设计一个网页,组长可以邀请其他人加入他/她的小组。我的要求非常简单。
如果已联系过此人,则不会发送重复的电子邮件。
向组长显示按邀请日期按升序排序的邀请列表。
似乎很容易。我创建了这个表。
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端排序并返回结果。
答案 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