我的毕业设计--数据库设计之站内信

Posted in 2016-12-26 14:56 | Category: 生活随笔 | Tags: 毕业设计 站内信 生活随笔

站内信设计

<2016-12-29 四>更新 添加站内信与用户组关系

逻辑实现

点对点(私信)

  • 发送方 sender
  • 接收方 receiver
  • 状态 status
  • 信息内容 message
  • 信息分类 message_type
  • 发送时间 created_at

    点对点发送消息比较简单,每次发送为单表时插入 sender, receiver, message, created_at

    (伪代码) - 获取未读信息

    select message from message where reveiver_id == 'user.id' and status = 'unread';
    
    • 获取系统未读信息

      select message from message where reveiver_id == 'user.id' and status = 'unread' and message_type = 'sys' - 获取已读信息

      status = 'read'

点到局部(新增)

考虑到发送消息到某一特定群体,某一组,需要站内信与用户组关联

使用多对多关系

group_message = db.Table(
    'group_message',
    db.Column('group_id', db.Integer, db.ForeignKey('group.id')),
    db.Column('message_text_id', db.Integer, db.ForeignKey('message_text.id')))

class MessageText():
    ......
    groups = db.relationship(
        Group,
        secondary=group_message,
        backref=db.backref(
            'message_texts', lazy='dynamic'),
        lazy='dynamic')
  • 获取未读消息 获取 message_text 表中receiver为current_user的数据,以及用户组中含receiver的数据,之后就和点对面相同

点对面(系统消息)

点对面实现不能像点对点一样为每一个用户创建一条数据(如果数以十万百万计) 具体实现看这里 http://www.cnblogs.com/grenet/archive/2010/04/09/1708008.html

简单讲一下我理解的逻辑(伪代码):

  • 发送私信(点对点)

    # 先保存消息主体内容
    message_text = MessageText(
        sender = sender,
        message = message,
        message_type = message_type(私信)
    )
    # 保存接受方,并关联消息主体
    message = Message(
        message_text_id = message_text.id,
        receiver = receiver,
        status = 'unread'
    )
    
    • 获取未读信息
      messages = Message.query.filter_by(receiver = current_user,status = 'unread')
      
  • 系统消息

    # 只保存消息主体内容
    message_text = MessageText(
        sender = sender,
        message = message,
        message_type = message_type(系统消息)
    )
    
    • 获取未读信息 判断 message 表中 message_text_id 是否存在于 message_text_id__list*(receiver = current_user) 不存在,标记为系统未读* 存在,判断是否未读
    • 获取具体未读信息 如上不存在

      # 保存消息
      message = Message(receiver = current_user,
                        status = 'read',
                        message_text_id = message_text.id)
      

      存在时,

      message.status = 'read'
      

数据库设计

信息表(关联)

tablename: message
字段名 字段类型 字段描述 是否为空 是否unique 默认值
receiver_id integer 接收方外键ID False False  
receiver   接收方 False False  
message_text_id integer 站内信主体内容外键ID False False  
message_text   站内信主体内容 False False  
status string 站内信状态 False False 0(未读)

信息内容表

tablename: message_text
字段名 字段类型 字段描述 是否为空 是否unique 默认值
title string(128) 站内信标题 False False  
content text(1024) 站内信内容 False False  
message_type string 站内信类别 False False 2(系统信息)
sender_id integer 发送方外键ID False False  
sender   发送方 False False