MongoDB:私人消息系统...如何跟踪发送的消息

问题描述:

如果有人要复制twitter的DM功能,你将如何去设计它的模式?我可以发送和回复邮件,但我的问题是如何跟踪发送的邮件?如果鲍勃向艾米发送消息,艾米会看到鲍勃的消息。鲍勃还在他的“发送文件夹”中有他的消息副本。MongoDB:私人消息系统...如何跟踪发送的消息

现在,每封邮件都有一个“收件人”和“发件人”。起初我以为我认为这是因为我可以查询发件人是谁,从而在用户的“发送”选项卡中显示消息。但是,艾米可能想要删除该消息,那么是什么?我不想摆脱这个消息,因为鲍勃无论出于何种原因仍然可能在发送的存档中需要它。

我能想到的唯一的其他选择是保存消息两次,这是愚蠢的,可能会失去控制。

+0

为什么要保存消息两次愚蠢?磁盘空间很便宜。非规范化存储在nosql系统中并不罕见。 – TTT 2010-06-28 03:27:19

我能想到的唯一的其他选择是保存消息两次,这是愚蠢的,可能会失去控制。

事实上,这与愚蠢完全相反。保存消息两次正是在这里预期的。在这些类型的非关系数据库中预计会出现去规范化。

然后看看你自己的描述。

Bob还在他的“发送文件夹”中有一条他的消息的副本。

好了,Bob有“副本”的消息的,似乎相当合理的这种“复制”是在数据库中不同的文档。

2解决方案,我能想到的是:消息的

  1. 保存2份。这可能看起来很浪费,但运行良好,尤其是在需要跨多个服务器进行分片时 - 所有用户的详细信息都会一起存储。 (注意:这是电子邮件的工作方式 - 一个非常分散的模型)

  2. 保存与发件人/接收器一个副本,因为你已经提到,但让你的删除功能“软”删除 - 即。将邮件标记为已删除,而不是实际删除邮件。如果您希望发件人和收件人能够独立删除邮件,则可能需要2个标志。

确定它的晚,但只是为读者晚:我觉得这是更好地2个字段添加到每个消息:

inbox (default = 1) 
outbox (default = 1) 

当收件人删除他的信息,收件箱变为= 0

时发件人删除他的消息,发件箱成为= 0

如果收件箱= 0和发件箱= 0,那么你可以从数据库中删除消息。

此外,添加名称为“new”= 1/0的字段也很不错 - 它显示收件人是否已阅读邮件。