我目前正在为网站开发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列一样。
但是我不确定这是否是理想的表结构。在开始编码之前,我想听听你对改进的想法。
答案 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
......或类似的东西。