2012-02-02 134 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