Cassandra 中的数据建模简单 table 无法正常工作
Data modeling easy table in Cassandra not working
我必须设计一个网页,组长可以在其中邀请人们加入 his/her 组。我的要求真的很简单
如果已经联系到此人,则不会发送重复的电子邮件。
向组长显示按邀请日期升序排列的邀请列表。
看起来很简单。我创建了这个 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));
我必须设计一个网页,组长可以在其中邀请人们加入 his/her 组。我的要求真的很简单
如果已经联系到此人,则不会发送重复的电子邮件。
向组长显示按邀请日期升序排列的邀请列表。
看起来很简单。我创建了这个 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));