PHP站内消息,如何设计数据表

海纳百川 发布于 2012/02/28 18:25
阅读 4K+
收藏 8
PHP

站内消息
用户->用户
单用户->多用户
管理员->群发所有用户
用户查看后可以删除,
有户之间单发比较简单,现在系统群发想不到好的办法,请教各位高手,这种情况数据表如何设计

加载中
0
飞晏
飞晏

DROP TABLE IF EXISTS `msg`;
CREATE TABLE `msg` (
  `msg_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '消息ID',
  `uid` int(10) unsigned DEFAULT NULL COMMENT '发送用户ID(为0则为系统发送)',
  `recive_uid` int(10) unsigned DEFAULT NULL COMMENT '接受用户ID,为0则为面向所有用户',
  `status` tinyint(3) unsigned DEFAULT '1' COMMENT '消息状态(0为已删除,1为未读,2为已读,3为已回复)',
  `msg_title` char(200) DEFAULT NULL COMMENT '短信息标题',
  `msg_text` text COMMENT '留言内容',
  `create_time` int(10) unsigned DEFAULT NULL COMMENT '留言时间',
  PRIMARY KEY (`msg_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

接受用户ID为0的时候面向所有用户。

读取的时候根据当前当前uid去查询revice_uid为0或者等于当前uid的。

单用户发给多用户就是多条记录了。

0
海纳百川
海纳百川

引用来自“飞晏”的答案

DROP TABLE IF EXISTS `msg`;
CREATE TABLE `msg` (
  `msg_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '消息ID',
  `uid` int(10) unsigned DEFAULT NULL COMMENT '发送用户ID(为0则为系统发送)',
  `recive_uid` int(10) unsigned DEFAULT NULL COMMENT '接受用户ID,为0则为面向所有用户',
  `status` tinyint(3) unsigned DEFAULT '1' COMMENT '消息状态(0为已删除,1为未读,2为已读,3为已回复)',
  `msg_title` char(200) DEFAULT NULL COMMENT '短信息标题',
  `msg_text` text COMMENT '留言内容',
  `create_time` int(10) unsigned DEFAULT NULL COMMENT '留言时间',
  PRIMARY KEY (`msg_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

接受用户ID为0的时候面向所有用户。

读取的时候根据当前当前uid去查询revice_uid为0或者等于当前uid的。

单用户发给多用户就是多条记录了。

用户如何删除消息呢,
系统给1w个用户发消息,每个用户看完后可以删除,这如何实现

0
飞晏
飞晏

引用来自“海纳百川”的答案

引用来自“飞晏”的答案

DROP TABLE IF EXISTS `msg`;
CREATE TABLE `msg` (
  `msg_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '消息ID',
  `uid` int(10) unsigned DEFAULT NULL COMMENT '发送用户ID(为0则为系统发送)',
  `recive_uid` int(10) unsigned DEFAULT NULL COMMENT '接受用户ID,为0则为面向所有用户',
  `status` tinyint(3) unsigned DEFAULT '1' COMMENT '消息状态(0为已删除,1为未读,2为已读,3为已回复)',
  `msg_title` char(200) DEFAULT NULL COMMENT '短信息标题',
  `msg_text` text COMMENT '留言内容',
  `create_time` int(10) unsigned DEFAULT NULL COMMENT '留言时间',
  PRIMARY KEY (`msg_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

接受用户ID为0的时候面向所有用户。

读取的时候根据当前当前uid去查询revice_uid为0或者等于当前uid的。

单用户发给多用户就是多条记录了。

用户如何删除消息呢,
系统给1w个用户发消息,每个用户看完后可以删除,这如何实现

既然要删除,估计只能把全员消息建多条记录了。
0
海纳百川
海纳百川

引用来自“飞晏”的答案

引用来自“海纳百川”的答案

引用来自“飞晏”的答案

DROP TABLE IF EXISTS `msg`;
CREATE TABLE `msg` (
  `msg_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '消息ID',
  `uid` int(10) unsigned DEFAULT NULL COMMENT '发送用户ID(为0则为系统发送)',
  `recive_uid` int(10) unsigned DEFAULT NULL COMMENT '接受用户ID,为0则为面向所有用户',
  `status` tinyint(3) unsigned DEFAULT '1' COMMENT '消息状态(0为已删除,1为未读,2为已读,3为已回复)',
  `msg_title` char(200) DEFAULT NULL COMMENT '短信息标题',
  `msg_text` text COMMENT '留言内容',
  `create_time` int(10) unsigned DEFAULT NULL COMMENT '留言时间',
  PRIMARY KEY (`msg_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

接受用户ID为0的时候面向所有用户。

读取的时候根据当前当前uid去查询revice_uid为0或者等于当前uid的。

单用户发给多用户就是多条记录了。

用户如何删除消息呢,
系统给1w个用户发消息,每个用户看完后可以删除,这如何实现

既然要删除,估计只能把全员消息建多条记录了。
1w个用户就要保存1w条记录,这个数据量有点大,有没有更好的方案
0
mark35
mark35

引用来自“海纳百川”的答案

引用来自“飞晏”的答案

引用来自“海纳百川”的答案

引用来自“飞晏”的答案

DROP TABLE IF EXISTS `msg`;
CREATE TABLE `msg` (
  `msg_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '消息ID',
  `uid` int(10) unsigned DEFAULT NULL COMMENT '发送用户ID(为0则为系统发送)',
  `recive_uid` int(10) unsigned DEFAULT NULL COMMENT '接受用户ID,为0则为面向所有用户',
  `status` tinyint(3) unsigned DEFAULT '1' COMMENT '消息状态(0为已删除,1为未读,2为已读,3为已回复)',
  `msg_title` char(200) DEFAULT NULL COMMENT '短信息标题',
  `msg_text` text COMMENT '留言内容',
  `create_time` int(10) unsigned DEFAULT NULL COMMENT '留言时间',
  PRIMARY KEY (`msg_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

接受用户ID为0的时候面向所有用户。

读取的时候根据当前当前uid去查询revice_uid为0或者等于当前uid的。

单用户发给多用户就是多条记录了。

用户如何删除消息呢,
系统给1w个用户发消息,每个用户看完后可以删除,这如何实现

既然要删除,估计只能把全员消息建多条记录了。
1w个用户就要保存1w条记录,这个数据量有点大,有没有更好的方案
对于群发,可以单独建立一个TABLE里面只有 msgid, userid两个字段,PK(msgid, userid)。一条msg发给N个用户就往这个表生成相应记录。如果用户删除此msg那么就删除在该表内的记录
0
t150ckh
t150ckh
为这个问题头痛
0
彭哥
彭哥
不用头痛,看看这个方法可行不?把发送给谁的id也就是接受信息用符的ID改为字符型,这样来就可以存取多组数组型字符了,然后把数组型数据转为真数组,然后读取每个数组的值就表示要发送给谁? 例如:接爱的id="15,25,35,55,100,158,115,178"等,然后取出数组,一一列出来来,哪些人有读取的权限!
0
m
myplease

table msg_data

m_id from_uid title content ctime stores(保留人数,如果为-1则物理删除)

table msg_relation

m_id to_uid has_read atime

用户发送信息保存到msg_data,同时记录被发送人数stores,
msg_relation记录发送到某人,某人删除后msg_data中的stores-1,发送者删除也是stores-1
当stores为-1时则彻底删除掉

备:合理使用mysql分区、触发器

0
t150ckh
t150ckh

引用来自“彭哥”的答案

不用头痛,看看这个方法可行不?把发送给谁的id也就是接受信息用符的ID改为字符型,这样来就可以存取多组数组型字符了,然后把数组型数据转为真数组,然后读取每个数组的值就表示要发送给谁? 例如:接爱的id="15,25,35,55,100,158,115,178"等,然后取出数组,一一列出来来,哪些人有读取的权限!
用这种方式,如果说是系统群发呢?上万个id拼成一个字符串显然不合理的!
0
彭哥
彭哥
合理的,成功发送一条就删除一个数组项!要不就建个表,把发送成功的ID全部按上序方式存在一个字段中,当然这个字段的作用就是记录发送成功信息的!
返回顶部
顶部