【问题标题】:PHP / MySQL PM System with multiple recipients table structure?具有多个收件人表结构的 PHP/MySQL PM 系统?
【发布时间】:2011-12-23 19:06:14
【问题描述】:

我目前正在为一个网站开发一个 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 列一样。

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

【问题讨论】:

    标签: php mysql table-structure private-messaging


    【解决方案1】:

    将 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
    

    ...或类似的东西。

    【讨论】:

    • 好吧,简而言之,您建议使用两张表,一张包含消息,一张为每个收件人插入一行,对吗?
    • 是的。如果您需要修改列表,则在字段中使用逗号分隔值会非常痛苦。搜索并没有那么糟糕,因为 mysql 有 find_in_set(),但是在其他数据库系统上,它会很快变得丑陋。无论底层系统如何,从 csv 中删除特定值都是很痛苦的。
    • 好的,谢谢。您如何看待线程系统?我的示例中的 parentid 和时间戳排序模型可以吗?
    • 听起来很有用。但是,当您开始对子级进行相当深入的分层时,递归结构在 sql 中会变得很痛苦。
    • 不错,你能想出更简单的方法吗?
    猜你喜欢
    • 2011-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-27
    • 2021-04-21
    • 1970-01-01
    相关资源
    最近更新 更多