2014-09-25 61 views
-1

我不确定这是否是一个好的电子邮件数据库架构。电子邮件数据库架构

我使用redis收件箱,存档,发送列表为每个用户存储对话ID(或线程ID)。每个对话ID指向消息ID的重新列表。每个消息ID都指向一个PostgreSQL消息表。无论何时发送或存档或删除邮件,我都会在redis列表中移动ID。

只有在跨消息进行搜索时,以及从线程获取消息时,因为必须始终检查线程中的消息是否属于您,有时候人们会在同一线程中进行回复,但对于不同的用户组。

这是一个很好的方法吗?有更好的想法吗?如何改善这一点?

+1

为什么这个模式的终点是PostgreSQL表? – Niloct 2014-09-25 21:20:53

+0

我无法为自信而争辩。我想如果我在Redis中存储消息,它会占用太多的内存。我不确定。 – 2014-09-26 06:11:19

回答

1

那么,到底你的论点是正确的:)

http://redis.io/topics/faq

的Redis是一个内存中,但在磁盘上的数据库中,所以它 代表了不同的权衡,其中非常高的写和读取速度 与的数据集的限制,即不能超过存储器更大 实现

所以你不能在Redis中保存所有东西。另外,您不能方便地进行文本搜索,因此将实际的消息数据保存在PostgreSQL或其他数据库(如Solr)中是必要的。

思考在您的案例中制作Redis图层的真正用处是什么。如果你保留Redis,它可以非常有效地处理ID,并且你也可以保留主题和电子邮件地址。做

最好的办法是启动一些用例:)

  • 显示最新消息(通过时间戳下令TS

    > sadd messages 1 2 
    > hmset message:1 ts 1411783175 author_id 1 subject "An e-mail for starting things up" 
    > hmset message:2 ts 1411783150 author_id 2 subject "An early e-mail from the startup one" 
    > hmset author_id:1 name "Johnny" email "[email protected]" 
    > hmset author_id:2 name "Sarah" email "[email protected]" 
    > sort messages by message:*->ts get message:*->subject 
    1) "An early e-mail from the startup one" 
    2) "An e-mail for starting things up" 
    

在这种情况下, ts是每条消息的历元时间

  • 列出线程中的用户(例如,线#)

    > sadd thread:1:messages 1 2 
    > sort thread:1:messages get message:*->author_id store thread:1:authors 
    > sort thread:1:authors get author_id:*->name get author_id:*->email 
    1) "Johnny" 
    2) "[email protected]" 
    3) "Sarah" 
    4) "[email protected]" 
    

这里螺纹:1:消息有消息ID,我们存储在线程作者:1:作者关键。

根据我对Redis的经验,您必须选择一个好的客户端(对于PHP来说无疑是PHPRedis [https://github.com/nicolasff/phpredis],因为它是一个C编译为php模块的扩展),并且在您的应用程序中也进行了大量处理。

希望是有用的。

相关问题