2010-06-04 109 views
0

我正在一個房地產網站上,需要做出通知郵件:當新的財產插入網站上,誰訂閱通知在該特定的國家和/或地區和/或城市和/或特定物業運營(租賃,銷售)將收到電子郵件通知。一個人可以訂閱不同的地區,城市等,而不僅僅是一個。儘管如此,一個人每週只會收到一份通知,讓他說是否有新的房產。我正在考慮如何更好地爲訂閱者創建一個mysql表格,以便輕鬆檢索它們。表所示:幫助與php/mysql郵件程序

create table subscribers(
user_email varchar(255), 
area_id int(4)); 

是一個壞主意,因爲如果有將讓說100,000(展望未來)的用戶和每個將認購10個領域將有一個表1,000,000行。所以,我正在尋找有效的解決方案來完成這樣的任務。

如果您有其他建議,我希望聽到它們。

在此先感謝!

回答

1

您應該使用交叉引用(多對多)表。這將使數據更規範化:

CREATE TABLE `areas` (
    `id` int(10) unsigned NOT NULL auto_increment, 
    `name` varchar(255) NOT NULL 
    PRIMARY KEY (`id`) 
) 


CREATE TABLE `subscribers` (
    `id` int(10) unsigned NOT NULL auto_increment, 
    `email` varchar(255) NOT NULL 
    PRIMARY KEY (`id`) 
) 


-- cross ref table 
CREATE TABLE `areas_subscribers` (
    `area_id` int(10) unsigned NOT NULL, 
    `subscriber_id` int(10) unsigned NOT NULL, 
    UNIQUE KEY (`area_id`,`subscriber_id`) 
) 

而一百萬行不是問題。特別是用交叉表。

+0

我總是害怕大桌子,因爲他們應該有額外的優化,否則他們會很慢。每次我試圖通過實現複雜的算法來避免多行具有相同數據(在本例中爲電子郵件)。 – Starmaster 2010-06-04 22:30:40

+0

該模式將處理該問題。這樣做交叉引用表意味着只使用兩個整數字段。漂亮而緊湊。另外他們被索引,所以查找速度會很快。 – webbiedave 2010-06-04 22:32:50

0

將有1,000,000行的表

還等什麼? mySQL can handle it

據我所知,你做這件事的方式非常好。這是很正常的,我想不出一個更好的方法。

0

假設user_email是識別用戶的主鍵,那麼表格看起來是正確的。如果是這樣,請在您的subscribers表中添加一個PRIMARY KEY (user_email, area_id)以指示這兩個字段一起構成您的主鍵。

您對複製電子郵件的擔心與模式設計無關,而與您打算運行的查詢有關。這,當然,將在很大程度上取決於如何你的其他數據存儲,但可能看起來像:(對於在過去一週已經看到上市area_id值的列表)

SELECT DISTINCT user_email WHERE area_id IN (...) 

這是一個簡單的查詢,可以根據您的架構的其餘部分進行優化和改進,但它說明了儘管多次列出同一個用戶,避免生成多個電子郵件是多麼容易。

0

您可以製作電子郵件地址的附加表格。 所以你只在訂閱表中存儲一個ID而不是一次又一次地存儲相同的電子郵件地址(而數據庫中可能會有一些優化)。