邮件数据库架构

时间:2014-09-25 17:14:18

标签: database email database-design redis database-schema

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

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

只有在搜索消息时以及从线程获取消息时,事情才会有点混乱,因为您必须始终检查线程中的消息是否属于您,有时人们会在同一个线程中回复但是一组用户。

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

1 个答案:

答案 0 :(得分: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 "john@somewhere.com"
    > hmset author_id:2 name "Sarah" email "masterchief@sarah.com"
    > 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 是每条消息的纪元时间

  • 在线程中列出用户(例如,帖子# 1

    > 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) "john@somewhere.com"
    3) "Sarah"
    4) "masterchief@sarah.com"
    

此处主题:1:消息有消息ID,我们将作者存储在主题:1:authors 键中。

根据我使用Redis的经验,你必须选择一个好的客户端(对于PHP无疑是PHPRedis [https://github.com/nicolasff/phpredis],因为它是一个C扩展编译到php模块),并做了大量的处理在你的申请中也是如此。

希望这很有用。