PHP / MySQL PM系统有多个收件人表结构?

时间:2011-11-07 16:53:48

标签: php mysql table-structure private-messaging

我目前正在为网站开发PM系统,用户必须能够将PM发送给多个收件人。当然,这意味着如果消息已经发送给用户A,B和C,则用户C可以删除该消息,而用户A和B则不会。 问题是这种系统的最佳数据库表结构是什么,当然要避免一个消息的多个副本。 目前我已经想到了这个表结构:

msgid (int),
parentid (int),
timestamp (timestamp),
senderid (int),
recipients (varchar),
subject (varchar)
text (text),
deletedby (varchar),
readby (varchar)

这将是唯一的表格。线程是根据parentid创建的(如果没有parentid消息是线程中的第一个),并按时间戳排序。收件人以逗号分隔存储在一列中,并使用WHERE userid IN(msg.recipients)进行检查。 deletedby列包含已删除消息的所有id(逗号分隔)用户,就像readby列一样。

但是我不确定这是否是理想的表结构。在开始编码之前,我想听听你对改进的想法。

1 个答案:

答案 0 :(得分:4)

将CSV值存储在单个字段中总是一个糟糕的设计,只会给您带来剧烈的痛苦。在推出系统进行生产之前,现在规范化设计:将收件人列表放入子表中,并在子记录上放置一个“已删除”单位,以指示该特定收件人是否删除了该邮件:

recipientsTable

messageID    int -> foreign key to messages table
recipientID   int -> foreign key to users table
read     bit - t = read, f = unread
deleted   bit - t = deleted, f = still there.
readON    date - timestamp of when recipient read message

......或类似的东西。