Cassandra 中的数据建模简单 table 无法正常工作

Data modeling easy table in Cassandra not working

我必须设计一个网页,组长可以在其中邀请人们​​加入 his/her 组。我的要求真的很简单

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

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

看起来很简单。我创建了这个 table.

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 似乎只对 whole PRIMARY KEY 起作用,所以C* 中的 LWT 对我不起作用。

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

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

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

2015 年 12 月 4 日新增:

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

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

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

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

关于cassandra数据建模,开局不错看DS220

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

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

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

问题二: 所以这里的基本问题是,当你有你的数据当前建模时,每个 email_address 值将在它自己的分区中,然后在该分区内 invite_date 将被排序。 @bydsky 说得对,他说您需要向 table 添加类似 group_id 的内容,并使其成为主键的分区键部分。如果执行此操作,然后将 invite_date 作为集群列添加到分区键,则该 group_id 的所有记录都将存储在同一分区中,并且 Order By 将起作用。 Order By 仅适用于同一分区,而不是您要求它执行的跨分区。

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