【问题标题】:Cassandra modelling on conversation messagingCassandra 对会话消息的建模
【发布时间】:2018-07-17 10:00:36
【问题描述】:

我仍在学习理解 Cassandra。我已阅读有关对话消息的类似问题和答案,但不满意,因为它不符合我的需求。这些都是我要解决的问题

  • 一个用户可以向一个或多个用户发送消息
  • 对话表 - 保存用户与用户之间的消息
  • 对话表 - 为您的所有用户显示最近的对话消息 与某个日期建立了对话,将其标记为已读或未读。
  • A 对话消息表 - 用户 A 可以加载与用户 B 的所有对话 或用户 C
  • 对话消息表 - 发送的消息将被标记为已读或未读
  • A 对话消息表 - 用户 A 可以删除消息,但用户 B 消息不会被删除。 非常重要

我有以下表格

创建表用户( 用户名文本主键, 密码文本 ); 创建表朋友( 用户名文本, 朋友的文字, 自时间戳以来, 主键(用户名,朋友) ); 创建表关注者( 用户名文本, 追随者文字, 自时间戳以来, PRIMARY KEY(用户名,关注者) ); 创建表会话_A ( 参与者文本, 参与者B文本, 对话文本, 消息文本, 读取布尔值, 日期时间戳, 主键(参与者A,日期) ); 创建表会话_B ( 参与者文本, 参与者B文本, 对话文本, 消息文本, 读取布尔值, 日期时间戳, 主键(参与者A,日期) ); 创建表会话消息发送( 对话文本, 消息id bigint, 发件人文字, 收件人文本, 消息文本, 读取布尔值, 日期时间戳, 主键(会话 ID,日期) }; 创建表会话消息接收( 对话文本, 消息id bigint, 发件人文字, 收件人文本, 消息文本, 读取布尔值, 日期时间戳, 主键(会话 ID,日期) }; 创建表messages_sent( 消息id bigint, 消息文本, 日期时间戳, 主键(messageid,日期) ); 创建表messages_receive( 消息id bigint, 消息文本, 日期时间戳, 主键(messageid,日期) );

如果用户 A id 为 100,则与用户 B 建立会话,而用户 B id 为 101,则会话 ID 将为 100-101。
请是 Cassandra 的新手,我想知道我的建模是否正确。
如果用户 A 向用户 B 发送消息,哪些会话表属于用户 A 或用户 B

如果用户 A 与用户 B 建立对话,用户 C 与用户 A 建立对话,并且用户 A 想要加载与用户 C 的所有对话,将从哪个对话消息表中获取消息?

我将如何查询会话表以列出所有用户,用户 A 已与用户 A 建立了对话,以及与用户 A 建立了包含最后发送或接收消息的对话的所有用户。

【问题讨论】:

  • 消息_send/receive的意义何在?
  • @danicheeta 是的
  • 我没有得到你的答案,你为什么不创建一个线程表并在其中存储消息,其中包含“已删除”、“已查看”、参与者 a ...等字段?
  • 这也是我想要实现的。我可以得到它的样本吗

标签: database cassandra nosql datastax cassandra-3.0


【解决方案1】:
create table users(
    id uuid,
    username text,
    name text,
    pass text,
    roles text,
    thread_ids set<uuid>,
    PRIMARY KEY (username),
);

你也可以添加头像网址和其他东西

create table thread (
    id uuid,
    participants set<uuid>,
    created_at timestamp,
    PRIMARY KEY (id),
);

参与者现在对我来说毫无用处,但它并不费心获得更多信息,

create table thread_users (
    thread_id uuid,
    from uuid,
    to uuid,
    PRIMARY KEY (thread_id),
);



create table thread_messages (
    id timeuuid,
    from uuid,
    to uuid,
    edited boolean,
    deleted boolean,
    seen boolean,
    body text,
    thread_id uuid,
    year int,
    month int,
    day int,
    hour int,
    minute int,
    PRIMARY KEY ((thread_id, year), id)
) WITH CLUSTERING ORDER BY (id DESC);

这应该写两次(从和到交换)以便于阅读查询,你需要有两种删除(deleted_from和deleted_to)覆盖你的最后一个问题点

create table thread_last_message_by_user (
    message_id uuid,
    user_id uuid,
    thread_id uuid,
    owner_id uuid,
    reply_of uuid,
    edited boolean,
    body text,
    year int,
    month int,
    day int,
    hour int,
    minute int,
    updated_at timestamp,
    PRIMARY KEY (user_id, thread_id, updated_at, message_id)
) WITH CLUSTERING ORDER BY (thread_id DESC, updated_at DESC);

我将它用于消息器的第一页,它只显示最后一条消息

这就是我正在开发的消息应用程序所得到的,顺便说一句,我的和你的原因有一些不同,你没有这样的线程,但你可以实现我所做的适合你的事情

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-30
    • 1970-01-01
    • 2014-10-11
    • 1970-01-01
    相关资源
    最近更新 更多