2012-02-02 133 views
2

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

例如 考虑一个表,认购数据

 | Column A | Column B |........ | mail_to      | 
    | Record 1 | abc  |   | [email protected],[email protected] | 

,如果我想要检索对应于记录邮件列表当前实现正常工作。但是如果我想搜索与[email protected]相对应的记录,查询速度太慢。我能想到

一个办法是

存储列A至n列认购数据 ,然后邮寄IDS在一个单独的表说用户电子邮件数据 和存储的信息的第三表加入。

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

任何人都可以建议一个更好的方式来存储这个邮件列表/帮助我评估哪两个更好。任何帮助,将不胜感激 。

谢谢

回答

0

虽然它违反3NF,但您可以同时存储这两种变体。但是如果你在寻找速度 - 一些非规范化可能会有所帮助。

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

0

首先

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

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

正如你提到的,你应该有这样的事情(UQ =唯一的)

认购

  • SubscriptionDataID(PK)
  • ColumnB
  • ColumnC
  • ...

USEREMAIL

  • EmailDetailID(PK)
  • SubscriptionDataID(FK)
  • EmailAddress的(UQ)
+0

嗨GBN,感谢您的评论,但我建议的理由3张表是因为用户可以有多个订阅。我不知道如何用你的建议模式来做到这一点。 – 2012-02-02 17:13:11

+0

@amitmodi:这是不明确的在您的问题... – gbn 2012-02-02 17:56:43

+0

我同意,我没有明确提到它,但声明“但是,如果我想搜索记录对应于[email protected],查询是太慢了。 “指定可以有多个属于同一用户的记录。 – 2012-02-02 19:29:03