V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
gongziqi
V2EX  ›  程序员

2 个人的多条 聊天记录怎么保存在同一个字段里

  •  
  •   gongziqi · 2017-04-17 17:13:22 +08:00 · 2130 次点击
    这是一个创建于 2777 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近做一个即时通讯 web ,这个怎么做呢?

    15 条回复    2017-04-20 10:26:38 +08:00
    ss098
        1
    ss098  
       2017-04-17 17:50:44 +08:00
    JSON 格式存储
    em70
        2
    em70  
       2017-04-17 17:54:29 +08:00 via Android
    XML 也可以
    johnny23
        3
    johnny23  
       2017-04-17 19:06:20 +08:00 via iPhone
    你这个需求太可怕了...
    gongziqi
        4
    gongziqi  
    OP
       2017-04-18 08:58:54 +08:00
    @ss098 存储到数据表怎么操作??(一条=一条插入 的话就建议了?)
    zwl2012
        5
    zwl2012  
       2017-04-18 13:27:39 +08:00 via iPhone
    另外创建一个记录表吧,你强行放到一个一段的话扩展性几乎没有。后面多人聊天怎么办?要撤回 /删除某个聊天记录怎么办?
    gongziqi
        6
    gongziqi  
    OP
       2017-04-18 14:53:37 +08:00
    @zwl2012 老铁 ,我就想问下 聊天记录是怎样的存储过程?一条条插入还是用其他技术插入??
    zwl2012
        7
    zwl2012  
       2017-04-18 15:50:08 +08:00 via iPhone
    就一个聊天记录表,字段有 id 时间 归属用户 目标用户 状态 ;调取某段会话直接根据目标用户查表再按时间排序即可。记录是一条一条插入的。
    fyyz
        8
    fyyz  
       2017-04-18 16:39:01 +08:00
    三个字段:
    1 ,发送者 ID
    2 ,接受者 ID
    3 ,内容

    可以扩展,添加这些字段:
    4 ,发送时间
    5 ,接收时间,为空则未接收

    如果有群组再扩展(针对第二个字段):
    7 ,接收者类型( enum[个人,群组,讨论组])
    ...
    fyyz
        9
    fyyz  
       2017-04-18 16:41:25 +08:00
    4 能让以后浏览聊天记录很方便,还能实现消息未发送成功提醒,避免客户端反复重新发送,其实就是应用层的 ACK 包。
    5 能实现离线消息功能。
    fyyz
        10
    fyyz  
       2017-04-18 16:42:20 +08:00
    其实我非常建议看看 TCP 的实现,我这套方案基本上是照着 TCP 的原理出的。
    fyyz
        11
    fyyz  
       2017-04-18 16:47:34 +08:00
    如果你要全部放进一个字段也可以,把我上面说的这些字段全部丢一个 json 里。但是弊端是,如果我要查看某两个用户的全部聊天记录,你就不能写出这种 SQL 了:

    select * from chat_log where (sender_id = 1 and recver_id = 2) or (sender_id = 2 and recver_id = 1)

    你必须在业务层遍历所有的聊天记录 json ,然后逐条分析。
    gongziqi
        12
    gongziqi  
    OP
       2017-04-19 11:26:30 +08:00
    @fyyz 我想问下大兄弟,对于聊天记录你能提供个思路给我吗?就是我现在做的 web IM ,用 websocket z 做协议。现在的想法是一条一条插入表字段中,但是这样太耗资源了,有没有新的办法?还有那个(
    ID VARCHAR2(32) not null,聊天记录 id
    CREATE_TIME DATE,创建时间
    CONTENT CLOB,聊天内容
    SEND_ID VARCHAR2(32),发送用户 id
    RECEICE_ID VARCHAR2(32),接收人 ID'
    STATES CHAR(2) default 0
    ) 这是我的表设计,对于插入记录和查询记录(发不同的人和点不同的人 插表 )怎样做好点呢
    fyyz
        13
    fyyz  
       2017-04-20 09:43:05 +08:00
    我想我已经说得很清楚了,但是我没有看懂你的问题:
    对于插入记录和查询记录(发不同的人和点不同的人 插表 )怎样做好点呢
    这话什么意思?
    gongziqi
        14
    gongziqi  
    OP
       2017-04-20 10:23:49 +08:00
    @fyyz 就是我这边打开记录看你的,你那边打开记录看我的 这种 sql 是这样一个写法?谢谢 啊
    fyyz
        15
    fyyz  
       2017-04-20 10:26:38 +08:00
    在 11 楼写得很清楚了。仔细看下?当然这种 SQL 必须配合我楼上给出的表结构。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1221 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 18:26 · PVG 02:26 · LAX 10:26 · JFK 13:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.