我想做这样的桌子
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。如果我对接受的列使用二级索引可以吗?
答案 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中可用