私人信息设计

时间:2009-02-19 11:46:18

标签: database-design

我正在开发一个新网站,我必须为我们的用户发送私信。我已经在其他项目上做过这个,但那里的设计似乎并不正确(例如,我不能让两个人参与一个消息)。 那么“正确”的方法是什么呢?我想为我的用户提供与Facebook相同的功能(再次,我已经做过这件事,但感觉很脏:)) 因此,系统应支持对话中的2个或更多用户以及类似线程的消息。

我在思考,一个解决方案就是有两个这样的表:

pm_messages: id | pm_messages_id | user_id |标题|内容| DATE_TIME

pm_recipients: id | pm_messages_id | user_id | has_seen |删除

我会将实际内容存储在“pm_messages”表中,然后将收件人(包括原始发件人)存储在“pm_recipients”表中。

这是正确的方向还是我完全没有这个?令我困扰的是,在所有收件人删除了导致某些尴尬的删除逻辑的邮件之前,邮件才真正被删除。

5 个答案:

答案 0 :(得分:6)

如果可以有多个收件人,并且他们可以发送回复邮件,那么您将更多地处理某种聊天应用程序。您可以将“聊天”会话或对话存储在单独的表中,对话和参与者之间具有1-n关系,以及对话和消息之间的1-n关系(下面列出的表格)。但最终,它当然取决于你。对于常规消息发送,当您使用时,消息和收件人之间会有1-n。

table user:
- id (pk)
- name

table conversation (one entry per "chat/messaging" session)
- id (pk)
- started_by_user_id
- started_ts

table conversation_participant (keeps track of all recipients)
- id (pk)
- conversation_id
- user_id (refers to user.id)

table message
- id
- conversation_id (refers to conversation.id)
- sender (refers to user.id)
- msg

答案 1 :(得分:1)

我不会说你在帖子中提出的实施必然是坏的。当然,它不是最简洁或最快的,但在我看来,对人类来说最容易理解。此外,删除逻辑不应该非常难以封装。

我建议的一个解决方案是使用一个存储每条消息的表,包含发件人ID的字段,另一个字段是收件人ID列表。当然,问题是决定如何使用标准数据库类型之一表示ID列表,因为通常没有数组/向量/列表类型。我建议您使用VARBINARY(max)类型,如果它可用,将其视为位向量(例如,每个收件人ID为4个字节)。然后你可以创建几个函数来对数组/列表进行非常简单的按位编码/解码。

答案 2 :(得分:0)

pm_messages表中的pm_messages_id列是什么?

否则它有意义......但我不明白为什么删除逻辑应该很尴尬。您可以通过以下两种方式之一处理它:

  1. 用户删除后:如果没有其他收件人则删除。
  2. 作为cron任务或稍后手动执行:没有理由认为此删除需要立即发生。它们只是孤儿记录,可以轻松找到它们:
  3. e.g:

    DELETE FROM pm_messages
    RIGHT JOIN pm_recipients ON pm_messages.id = pm_recipients.pm_messages_id
    

答案 3 :(得分:0)

需要考虑的另一个用例(我知道我的用户想要这个)......他们都想要“发送的项目”。可能要在清洁之前考虑一下这个用例。

  

这里困扰我的是信息   不要真的被删除直到所有   收件人已删除   消息导致一些尴尬   删除逻辑。

创建一个为您执行此操作的触发器。您需要做的所有应用程序代码都担心将“已删除”列设置为true,并且当每个人将消息标记为已删除时,让UPDATE触发器完成整个交易。

当然,接下来您知道,您的用户希望取消删除。就个人而言,我永远不会从数据库中删除该消息,只需将其隐藏起来即可。

答案 4 :(得分:-1)

(评论太长)

Tehvans方法涉及存储特定对话的参与者列表,而在您的方法中,参与者按消息存储。我希望这样做的原因是允许删除和读取标记,问题是 - 为什么会这样?

论坛通常不要求您将会话的每个部分标记为已读取,因此在参与者表中存储last_read时间戳,这样可以突出显示在时间戳之后创建/修改的任何消息。

在(几乎)所有情况下,删除论坛消息都是由作者/管理员完成的,并导致消息从视图中删除给所有用户。