带有Cassandra的内部网络应用程序数据模型



我正在努力设计一个应用程序,该应用程序将使用户可以发送请求以相互连接,查看他们的已发送或接收请求,在交互期间做笔记,以供以后参考,如果连接,并从其联系列表中删除用户。

在RDBMS中,模式将是:

列的表用户

  • uid(每个用户的唯一字符串(

带有列的表请求:

  • 来自 - 用户ID

  • to-用户ID主键(从,到(

  • 创建-Timestamp

  • 消息 - 字符串

  • 到期-Timestamp

表与列的连接:

  • 来自 - 用户ID

  • to-用户ID

主键(从,到(

  • 注意 - 字符串

  • 创建-Timestamp

  • 修改-Timestamp

  • iSfavurete- to是用户的最爱,值0或1

  • ISACTIVE-软删除,值0或1

  • 配对连接 - 显示了for之间的连接是否已停用(对用户从用户从其联系人列表中删除了从其接触列表中删除(,值0或1

我期望需要的查询是:

  • 查找用户的已发送请求

  • 查找用户的接收请求

  • 查找给定用户的所有主动联系

  • 找到用户的所有收藏夹

  • 查找从用户列表中删除给定的所有用户

  • 在与另一个用户见面时,更新用户所做的注释,他与

  • 连接
  • 更新用户作为fely

  • 软删除的标记连接

我正在尝试在卡桑德拉(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)
);

cassandra与RDBM的范式不同,这对于必须进行数据建模的方式更为明显。您需要牢记,优先考虑统计化是优先的,并且您将拥有重复的数据。

表定义应基于检索数据的查询,例如:

在问题的定义中部分说明。

查找用户的已发送请求

采用表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是一个有限的关键字,可以使用default_time_to_live子句(TTL(的定义设置expiry信息,该定义将在定义时间之后删除记录;此值是插入记录后的秒数,示例为10天(864,000秒(。

主键建议是电子邮件地址,但也可以是uuid,不建议使用名称,因为可以有多个人共享相同名称(例如James Smith(,否则同一个人可以有多种方法来写作该名称(按照示例Jim SmithJ. Smithj 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_userrequests_received_by_user,这将确保两位表之间的信息的一致性,而TTL(数据的到期(也将相同。

存储联系人

在问题中有4个连接表:connectionsactive_connectionsfavourite_connectionspaired_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'

更新用户作为fale

这将是一个批处理,在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_connectionsfavourite_connectionspaired_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;

相关内容

最新更新