V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zzkde
V2EX  ›  数据库

web 站内私信该如何设计数据库表

  •  
  •   zzkde · 2020-04-10 17:44:24 +08:00 · 1448 次点击
    这是一个创建于 1718 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现在的想法是 两张表 一张会话表,一张消息表。发送消息时查看是否有对应的会话,没有就创建一个会话。

    dialog
    id
    user1_id	// 保证用户 user1_id > user2_id,这样方便查找两个用户的会话
    user2_id
    last_time  // 上一个消息发送时间
    last_message // 消息内容
    last_username // 消息发送者
    
    message
    id
    dialog_id
    from_user
    to_user
    content
    created_date
    has_read
    

    查看一个用户的所有会话的最近消息

    select last_time, last_message, last_username from dialog where user1_id = userId or uesr2_id = userId order by last_time desc;
    

    查看单独一个用户和另外一个用户的消息

    select * from message where dialog_id = id;
    

    但是这样做不知道如何设计用户删除会话或者会话中的某一条消息,如果直接删除了之后,另外一个用户的消息记录也没有了

    第 1 条附言  ·  2020-04-10 23:50:00 +08:00

    感谢 @lhx2008、@zczy 的建议,现在大致解决方案如下

    # message
    id 
    content
    from_user
    to_user
    created_date
    
    # inbox
    id
    user_id
    message_id
    dialog_id
    
    # dialog
    id
    last_time
    last_message
    last_username
    user1_id
    user2_id
    

    添加了一张收件表 inbox,发送的时候往 inbox 表插两条记录,一条发送者,一条接受者。这样删除就不会影响了。

    查看用户的所有会话的最近消息

    select last_username, last_message from inbox where inbox.user_id = userId and inbox.dialog_id = dialog_id.id order by last_time;
    

    查看单个用户和另外一个用户的详细消息

    select content, from_user, to_user from inbox, dialog, message where dialog.user1_id = user1Id and dialog.user2Id and dialog.id = inbox.dialog_id and inbox.message_id = message.id order by created_date;
    

    删除一个用户的一条消息

    delete from inbox where user_id = userId and message_id = messageId;
    

    删除用户的一个会话

    delete from inbox where user_id = userId and dialog_id = dialogId;
    
    4 条回复    2020-04-10 22:22:49 +08:00
    zpfhbyx
        1
    zpfhbyx  
       2020-04-10 18:00:54 +08:00
    weibo 的推拉机制
    lhx2008
        2
    lhx2008  
       2020-04-10 18:03:43 +08:00 via Android   ❤️ 1
    消息是消息,不包含用户。用户再关联上消息,然后设置几个标志位。
    jinsongzhao
        3
    jinsongzhao  
       2020-04-10 18:04:35 +08:00 via Android
    标记为删除状态,不做实际删除
    zczy
        4
    zczy  
       2020-04-10 22:22:49 +08:00   ❤️ 1
    消息存一份在消息表,再存一份在收件箱,发件箱可以不,这样收件人发件人删除就互不干扰了
    两个都删除是消息撤回
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3207 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 12:35 · PVG 20:35 · LAX 04:35 · JFK 07:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.