database - 电子邮件数据库架构

标签 database email database-design redis database-schema

<分区>

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

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

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

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

最佳答案

好吧,最后你的论点是正确的:)

http://redis.io/topics/faq

Redis is an in-memory but persistent on disk database, so it represents a different trade off where very high write and read speed is achieved with the limitation of data sets that can't be larger than memory

所以你不能把所有的东西都保存在 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"
    

这里 thread:1:messages 有消息 ID,我们将作者存储在 thread:1:authors 键中。

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

希望有用。

关于database - 电子邮件数据库架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26044377/

相关文章:

java - JDBC - 无法与本地主机连接

Php - imap_delete - 删除刚刚选择的电子邮件

database - 我在哪里可以找到有关数据库和文件系统设计的有用信息?

sql - 如何根据位置接近度取平均值

mysql - 不同角色用户的最佳表结构

php - Mailgun:如何跟踪消息 ID(以及引用和回复)以构建线程

javascript - 制作电子邮件表格 发送电子邮件

mysql - 用于存储未知和技术上无限长度的数据的数据库字段长度?

sql - 直观地概述Oracle SQL数据库的工具

mysql - 主表可以与另一个主表有关系吗?