私信通知 - 数据库表设计

Posted

技术标签:

【中文标题】私信通知 - 数据库表设计【英文标题】:Private Messaging Notification - Database Table Design 【发布时间】:2012-02-04 22:13:26 【问题描述】:

我已经创建了一个使用 phpmysql 的私人消息传递系统,其通知有点像 Facebook。

数据库表有以下字段(未全部列出):

消息ID 发件人用户ID RecUserID 留言 主题 日期时间 状态 - 是否已读 RepliedStatus - 我应该如何使用它? DeleteRec - 从收件箱中删除 DelSender - 删除发件人收件箱 RepliedUserId - 当用户回复原始消息时,这是对接收者 ID 的更改

所有回复都存储在第二个表中,因为每条消息都会创建一个线程。第二个表看起来有点像这样:

messageID - FK repuserID 消息 日期时间

在向用户发送新消息时,我将消息的“状态”更改为未读,由此可以运行计数查询以在通知中列出所有未读消息。

但如果用户回复该消息,我无法将原始“状态”字段设置为未读,因为这将出现在两个用户的通知中。所以我创建了另一个名为“RepliedStatus”的字段,但我不确定如何使用它来显示消息回复通知?

谢谢大家。

【问题讨论】:

【参考方案1】:

如果您有回复表,那么您的第一个状态不需要回复状态列。由于回复表中存在一条记录,您就知道用户已经回复了一条消息

【讨论】:

aah 回复表中的状态存在一个问题,两个(发送者/接收者)用户都会收到通知,因为回复就像主消息的线程,有点像脸书。示例:用户 A 向用户 B 发送消息,用户 B 回复该消息,而不是用户 A 回复同一消息,等等所有这些都在同一消息中。【参考方案2】:

为什么不向名为“previous_message”的第一个表(比如说“messages”表)添加一个 INT 和可为空的列?

ALTER TABLE messages ADD COLUMN previous_message INT DEFAULT NULL;

因此,每条消息都将在同一张表中包含前一条消息,您可以计算出顺序。如果有帮助,您可以拥有一个具有相同定义的“next_message”列,并在回复时更新相关记录。

这样做您可以在每个回复中使用状态列。

如果您想保持相同的数据库组织,我建议在第二个表上添加一个列状态(比如说“回复”)。

希望对你有帮助

【讨论】:

【参考方案3】:

我将删除的列放一次,对于已读或未读的内容相同:

["0":"both", "1":"Sender", "2":"receiver"];

然后获取胎面消息,例如:

$sql = "SELECT * FROM messagetreads 
WHERE (senderID OR receiverID = ".$_SESSION['MyCurrentId'].")
AND deleted !== 0
ORDER by TreadID AND DateTime ASC";

当发送方“delete”为tread时...如果delete colomn为2,则数据库中所有treadrelatedID都更改为1或0...

但我认为最好创建另一个列来获取重复的删除和通知数据,例如

TreadID (FK_message_Table) 删除(0=已删除 UserID=不显示给此发件人或收件人) 通知(0=都读取 UserID=读取给这个发送者或接收者)

然后就是改变状态或者删除语句的ezee。

SELECT 会是这样的:

$SQL = "SELECT * 
FROM messagetreads
WHERE (senderID OR receiverID = ".$_SESSION['MyCurrentId'].")
IN (SELECT TreadID WHERE delete !== (0 OR ".$_SESSION['MyCurrentId']."))";

如果是我们的成员ID,则在列中删除所有不出现的消息,但如果是发送者将删除时接收者的ID,则可以归因于0,以便两个成员都可以“删除”消息。通知也一样!

很久以后,一个 cron-job 可以删除非常旧的消息 read(0)...

PS:这也可以是通知系统,例如通知墙上的新帖子或评论照片或日历上的新事件......只需在列数据中添加更多信息并使用 php 或 java-ajaxed 等方式对其进行格式化。 ..

【讨论】:

[queue]:phpmaster.com/zend-queue 我发现有趣的通知方式是存储消息的时间戳和成员对 message_tread 的访问,并在类似的并行过程中进行比较zend-queue doe's ([zend-queue on PHP-MASTER][queue]phpmaster.com/zend-queue/).Also 我将参与者与另一个表中的踏板分开,因为我只想能够将成员添加到消息踏板中(就像 Facebook. ..) 并且所有行都包含上次访问的时间戳、user_id、message_Tread_id

以上是关于私信通知 - 数据库表设计的主要内容,如果未能解决你的问题,请参考以下文章

消息系统的设计

sqlserver 字符串拼接及拆开联表查询的问题

Facebook 喜欢通知跟踪(数据库设计)

用户收到推送通知后更新表视图中的数据

来自数据库表的 Azure 移动服务推送通知

HBase概念学习开发一个类twitter系统之表设计