内部网络应用数据模型与Cassandra

hfsqlsce  于 2021-06-14  发布在  Cassandra
关注(0)|答案(1)|浏览(435)

我正在设计一个应用程序,它可以让用户发送相互连接的请求,查看他们发送或接收的请求,在交互过程中做笔记,以备以后连接时参考,并从联系人列表中删除用户。
在rdbms中,模式为:
带列的表用户
uid(每个用户的唯一字符串)
带列的表请求:
发件人-用户id
to-用户id主键(from,to)
已创建-时间戳
消息-字符串
到期-时间戳
与列的表连接:
发件人-用户id
收件人-用户id
主键(从,到)
注解-字符串
已创建-时间戳
修改-时间戳
isFavorite-to是来自用户的收藏夹,值为0或1
isactive-软删除,值0或1
pairedconnection-显示收件人和发件人之间的连接是否已停用(收件人用户已将发件人用户从其联系人列表中删除),值为0或1
我预计需要的问题是:
查找为用户发送的请求
查找接收到的用户请求
查找给定用户的所有活动联系人
查找用户的所有收藏夹
查找从列表中删除给定发件人用户的所有用户
更新用户在与他连接的另一个用户见面时所做的笔记
将用户更新为收藏夹
将连接标记为软删除
我试图在Cassandra模型这一点,但感到困惑的关键是选择最大的效率。
到目前为止,我有以下想法,欢迎更有经验的cassandra用户提供反馈:

create table users(
uid text PRIMARY KEY
); 

create table requestsByFrom(
from text,
to text,
message text,
created timestamp,
expiry timestamp,
PRIMARY KEY (from,to)

create table requestsByTo(
from text,
to text,
message text,
created timestamp,
expiry timestamp,
PRIMARY KEY (to,from)
);

create table connections(
from text,
to text,
notes text,
created timestamp,
modified timestamp,
isFavourite boolean,
isActive boolean,
pairedConnection boolean,
PRIMARY KEY (from,to)
);

create table activeConnections(
from text,
to text,
isActive boolean,
PRIMARY KEY (from,isActive)
);

create table favouriteConnections(
from text,
to text,
isFavourite boolean,
PRIMARY KEY (from, isFavourite)
);

create table pairedConnection(
from text,
to text,
pairedConnection boolean,
PRIMARY KEY ((from,to), pairedConnection)
);
xmd2e60i

xmd2e60i1#

cassandra有一个不同于rdbms的范例,这在数据建模的方式上更加明显。您需要记住,反规范化是首选的,并且您将有重复的数据。
表定义应基于检索数据的查询,这在问题定义中有部分说明,例如:
查找为用户发送的请求
以table的初步设计为例 requestsByFrom ,另一种选择是

CREATE TABLE IF NOT EXISTS requests_sent_by_user(
    requester_email TEXT,
    recipient_email TEXT,
    recipient_name TEXT,
    message TEXT,
    created TIMESTAMP
PRIMARY KEY (requester_email, recipient_email)
) WITH default_time_to_live = 864000;

请注意 from 是一个受限关键字 expiry 可以通过定义默认的\u time \u to \u live子句(ttl)来设置信息,该子句将在定义的时间之后删除记录;该值是插入记录后的秒数,示例为10天(864000秒)。
主键建议是电子邮件地址,但也可以是uuid,不建议使用名称,因为可能有多个人共享同一个名称(例如 James Smith )或者同一个人可以有多种方式来写名字(下面的例子) Jim Smith , J. Smith 以及 j smith 可能指同一个人)。
名字 recipient_name 也会添加,因为您很可能希望显示它;应添加将与查询一起显示/使用的任何其他信息。
查找接收到的用户请求

CREATE TABLE IF NOT EXISTS requests_received_by_user(
    recipient_email TEXT,
    requester_email TEXT,
    requester_name TEXT,
    message TEXT,
    created TIMESTAMP
PRIMARY KEY (recipient_email, requester_email)
) WITH default_time_to_live = 864000;

最好将记录添加到 requests_sent_by_user 以及 requests_received_by_user 同时使用批处理,这将确保两个表之间信息的一致性,同时ttl(过期数据)也将是相同的。
存储联系人
问题中有4个连接表: connections , active_connections , favourite_connections , paired_connections ,它们之间有什么区别?他们会有不同的规则/用例吗?如果是这样,将它们作为不同的表是有意义的:

CREATE TABLE IF NOT EXISTS connections(
    requester_email TEXT,
    recipient_email TEXT,
    recipient_name TEXT,
    notes TEXT,
    created TIMESTAMP,
    last_update TIMESTAMP,
    is_favourite BOOLEAN,
    is_active BOOLEAN,
    is_paired BOOLEAN,
    PRIMARY KEY (requester_email, recipient_email)
 );

CREATE TABLE IF NOT EXISTS active_connections(
    requester_email TEXT,
    recipient_email TEXT,
    recipient_name TEXT,
    last_update TIMESTAMP,
    PRIMARY KEY (requester_email, recipient_email)
);

CREATE TABLE IF NOT EXISTS favourite_connections(
    requester_email TEXT,
    recipient_email TEXT,
    recipient_name TEXT,
    last_update TIMESTAMP,
    PRIMARY KEY (requester_email, recipient_email)
);

CREATE TABLE IF NOT EXISTS paired_connections(
    requester_email TEXT,
    recipient_email TEXT,
    recipient_name TEXT,
    last_update TIMESTAMP,
    PRIMARY KEY (requester_email, recipient_email)
);

注意,布尔标志被删除,逻辑是如果记录存在于 active_connections ,则假定它是活动连接。
当一个新的连接被创建时,它可能在不同的表中有几个记录;要捆绑所有这些插入或更新,最好使用批处理
查找给定用户的所有活动联系人
根据建议的表格,如果请求者的电子邮件test@email.com:

SELECT * FROM active_connections WHERE requester_email = 'test@email.com'

将用户更新为收藏夹
这将是一个批量更新中的记录 connections 并将新记录添加到 favourite_connections :

BEGIN BATCH

UPDATE connections 
SET is_favourite = true, last_update = dateof(now())
WHERE requester_email ='test@email.com' 
  AND recipient_email = 'john.smith@test.com';

INSERT INTO favourite_connections (
    requester_email, recipient_email, recipient_name, last_update
) VALUES (
    'test@email.com', 'john.smith@test.com', 'John Smith', dateof(now())
);
APPLY BATCH;

将连接标记为软删除
连接的信息可以保存在 connections 禁用所有标志,并从中删除记录 active_connections , favourite_connections 以及 paired_connections ```
BEGIN BATCH

UPDATE connections
SET is_active = false, is_favourite = false,
is_paired = false, last_update = dateof(now())
WHERE requester_email ='test@email.com'
AND recipient_email = 'john.smith@test.com';

DELETE FROM active_connections
WHERE requester_email = 'test@email.com'
AND recipient_email = 'john.smith@test.com';

DELETE FROM favourite_connections
WHERE requester_email = 'test@email.com'
AND recipient_email = 'john.smith@test.com';

DELETE FROM paired_connections
WHERE requester_email = 'test@email.com'
AND recipient_email = 'john.smith@test.com';

APPLY BATCH;

相关问题