消息回复模块设计

简单的场景:比如是一个客户反馈系统,客户反馈的时候,我们需要针对一个话题进行回复,话题在客服和客户之间轮转回复,但并没有强制的限制要求客户和客服只能一问一答,客户和客服都可以回复多次。

复杂的场景就是如贴吧,论坛等,可以针对某个回复进行插楼回复,这种针对一个热门话题很有用,大家可以针对自己的爱好,进行插楼回复,忽略不感兴趣的话题。

先来分析第一个简单的场景,默认不支持插楼的场景,类似QQ聊天的场景,只有简单的二级关系,一级对应话题,所有的回复都是二级,在二级内都是平级关系,但是拥有先后关系,每一个回复是有先后顺序的。

简单的场景覆盖:

  • 体现回复的内容
  • 体现回复的先后顺序
  • 可辨别回复人身份
  • 支持消息状态标识

简单ER图

根据上述的描述,我们简单设计一下的存储细节:

message center design

上述结构中,我们存储了一下字段:

Column Type Description
create_time bigint 消息创建时间
status int 消息状态
user_id vchar(16) 用户ID
parent_id foreign key 回复消息ID
content text 消息内容

通过上述简单的设计,我们可以实现我们的需求,通过self - self的外键关系,我们可以通过索引是否是空来辨别那些是需求,那些是回复内容(跟帖);通过外键我们也能快速查看一个需求的所有回复,最终通过create_time来快速排序;通过user_id来获取消息创建人的角色,辨别是用户还是admin。

上面这个简单的设计中,我们主要通过表的自外键连接来快速查找到一个话题的所有的回复,但是标准的做法应该是建立一张话题表,然后再来一章评论表,评论表通过外键与话题表进行关联。

general design

这个设计上实际上和上面的并无差异,只是把话题单独抽象成一个表进行存储,适合数据量更加大的情形。

在上述设计的基础上,我来可以再来看看带有插楼功能的话题回复应该如何设计。带有插楼功能的情形是我们不仅要区分回复属于那个话题,还需要知道他的前置回复是谁,不是简单的二级关系,我们可能遭遇多级的情况,比如某一楼的回复比较有意思,那么就可能出现盖楼的情况,存在多级的情况;另外还需要考虑在同一级楼的前后顺序。

general design

上述设计中,只是增加了回复表的自外键参考结构,起的作用就是可以通过这个关系查看到当前回复的父级消息是谁,最终构造出复杂的多级关系,唯一的问题是,不太好输出最终的数据结构,解析困难。

Django 设计

针对第一种场景,我们做一下实例:


import time
from django.db import models

class Comments(models.Model):
    """user comments """

    STATUS = (
        (0, u"创建"),
        (1, u"未读"),
        (2, u"查看"),
        (3, u"关闭")
    )

    objects = CommentsManager() # 对象管理器

    create_time = models.BigIntegerField(default=time.time()) # 创建时间
    status = models.IntegerField(default=0, choices=STATUS)   # 帖子状态
    user_id = models.CharField(max_length=16, null=False, blank=False) # 创建用户
    parent_id = models.Foreign_key("self", default=None, null=True, related_name="comments") # 参考话题
    content = models.TextField(blank=False, null=False) # 回复内容

class CommentsManager(models.Manager):
    """comments manager"""

    def get_queryset(self):
        """
        Get Default Queryset
        :return: 
        """
        return super(TemplateManager, self).get_queryset()

    def get_all_topics(self):
        """
        Get all topics
        """
        return self.get_queryset().filter(parent_id=None).values(
            "status", "user_id", "status", "content")

    def get_all_comments_by_tid(self, tid):
        """
        Get all comments by parent id

        :param tid:
        """
        topic = self.get_queryset().get(pk=tid)
        return topic.comments().values(
            "status", "user_id", "status", "content")

上述实例只是测试了没有插楼的情形,插楼的情况下,需要我们创建两个表,如果有需要可以上述示例的基础上进行扩展。

转自:
http://infinite.36deep.com/message-center

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,755评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,369评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,799评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,910评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,096评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,159评论 3 411
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,917评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,360评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,673评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,814评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,509评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,156评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,123评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,641评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,728评论 2 351

推荐阅读更多精彩内容