【问题标题】:Storing a mailing list in Database / MySQL在数据库 / MySQL 中存储邮件列表
【发布时间】:2012-02-02 06:28:54
【问题描述】:

我有数百万条记录(行)的表。 在这个表中有一个名为 mail_to 的表。 每条记录对应一个邮件列表,然后邮件列表的信息存储在该列mail_to中。 在我系统的当前实现中,我将邮件列表存储为逗号分隔的邮件 ID 列表。

例如 考虑一个表格,订阅数据

     | Column A | Column B |........ | mail_to                     |
     | Record 1 | abc      |         | xyz@gmail.com,abc@gmail.com |

如果我想检索与记录对应的邮件列表,当前的实现工作正常。但是如果我想搜索abc@gmail.com对应的记录,查询太慢了。

我能想到的一种方法是

订阅数据中将 A 列存储到 N 列 然后在单独的表格中显示邮件 ID,说 用户电子邮件数据 第三个表,存储join的信息。

但是,我不确定它是否会给我带来任何改进,因为我每次查询都会有 2 个连接。

谁能建议一种更好的方式来存储这个邮件列表/帮助我评估两者中哪个更好。任何帮助将不胜感激。

谢谢

【问题讨论】:

    标签: mysql sql database


    【解决方案1】:

    您可以存储这两种变体,尽管它违反了 3NF。但如果您追求速度 - 一些非规范化可能会有所帮助。

    您可以使用旧的串联邮件列表进行一些处理,并使用新的多表模式进行快速搜索。

    【讨论】:

      【解决方案2】:

      首先

      • 数据库旨在加入。
      • 数据库并非旨在扫描 CSV 数据以提取部分字符串。

      您当前的设计打破了规范化的第一条规则:没有重复组。

      正如你所说,你应该有这样的东西(UQ = 唯一)

      订阅

      • 订阅数据 ID (PK)
      • B 列
      • C 列
      • ...

      用户电子邮件

      • EmailDetailID (PK)
      • 订阅数据 ID (FK)
      • 电子邮件地址 (UQ)

      【讨论】:

      • 您好 gbn,感谢您的评论,但我建议 3 个表的原因是因为用户可以有多个订阅。我不确定如何使用您建议的架构来做到这一点。
      • 我同意我没有明确提及,而是声明“但是如果我想搜索abc@gmail.com对应的记录,查询太慢了。”指定可以有多个记录属于同一用户。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-11
      • 1970-01-01
      • 1970-01-01
      • 2016-11-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多