卡桑德拉-如何在朋友面前接受餐桌

时间:2018-08-21 04:33:37

标签: cassandra

我想做这样的桌子

CREATE TABLE friendInvite {
  user text,
  invitee text,
  accepted boolean
  PRIMARY(invitee, user)
}

预期的查询是

1. SELECT * FROM friendInvite WHERE invitee="me" and accepted=false
2. UPDATE friendInvite SET accepted=true WHERE invitee="me" and user="you"

由于条件允许,我认为查询#1的性能不佳。

我如何在Cassandra上处理此问题?

我无法想象使用二级索引来接受。因为如果被邀请者接受报价,它将被更新为true。如果我对接受的列使用二级索引可以吗?

2 个答案:

答案 0 :(得分:1)

我将创建2个表。

CREATE TABLE friendInvites {
  user text,
  invitee text,
  PRIMARY(invitee, user)
}

此表保存未处理的朋友请求并为您的查询#1服务:

1. SELECT * FROM friendInvite WHERE invitee="me"

然后我将创建第二个表,用于存储接受的朋友请求:

CREATE TABLE acceptedRequests {
  user text,
  invitee text,
  PRIMARY(user, invitee)
}

当您接受请求时,必须从 friendInvites 中删除该条目并将其插入 acceptedRequests

答案 1 :(得分:0)

也许您可以使用materialized view来执行您的第一个查询而不会降低性能:

您的表格:

CREATE TABLE friendInvite (
  user text,
  invitee text,
  accepted boolean
  PRIMARY KEY (invitee, user)
);

物化视图:

CREATE MATERIALIZED VIEW friendInviteByInviteeAndAccepted
AS
SELECT *
FROM friendInvite
WHERE invitee IS NOT NULL 
   AND user IS NOT NULL
   AND accepted IS NOT NULL
PRIMARY KEY ((invitee, accepted), user)
WITH CLUSTERING ORDER BY (user ASC);

您可以在第一个表friendInvite上执行更新,并且可以从实例化视图中读取数据。当您更新表中的数据时,Cassandra将自动更新实例化视图。

此功能在cassandra> = 3.0中可用