2011-03-15 20 views
0

我想實現一個郵件系統,當新博客帖子與他們配置的首選項相匹配時,通知我的註冊用戶 通知。如何儲存用戶偏好以進一步查詢?

當用戶配置自己的喜好,這基本上下面創建一個SQL查詢, 但我不覺得它很乾淨/安全的SQL查詢存儲在數據庫中。除非我被告知否則。

此外,我想要一個解決方案,如果我在未來添加更多過濾器的標準,將可以很好地擴展。

一個想法我的,是serialize()包含所有WHERE數據PHP數組。

這是實現這一目標的最有效方法嗎?還是有其他解決方案嗎?

預先感謝您。

PS:我不是在尋找郵件庫。我只想找到一個關於如何以最有效的方式設計我的應用程序的提示。

編輯: 我收到兩個類似的答案提供相同的解決方案。恐怕我的問題有點複雜。

如果我只添加標籤首選項可能,解決方案的工作原理。

如果我想進行特定的過濾操作,例如:UserB想要在標記爲html的帖子得到通知並且至少有one評論(或投票)。

這就是爲什麼我說SQL查詢基本上是在用戶選擇它的首選項時創建的。我想添加this鏈接。

謝謝。

回答

1

爲什麼不使用只有auto_increment id字段和電子郵件字段的表格,然後在您的博客上使用簡單的電子郵件輸入?

你有一個用戶表?

編輯:我認爲你需要一個名爲user_preferences第二表id + id_user + tag像:

id | id_user | tag 
1 | 1 | php 
2 | 1 | html 
3 | 2 | php 

然後

SELECT DISTINCT email 
FROM user 
INNER JOIN user_preferences ON id_user = user.id 
WHERE tag IN ('tag1', 'tag2', 'tag3'); 
+0

我想你錯了我的問題。我會給你一個例子:'UserA'配置它的首選項,以便在(並且僅當)帖子包含'php'和'database-queries'標籤時收到通知郵件。這些首選項必須存儲在數據庫中。什麼是最有效的方法來做到這一點? – Cybrix 2011-03-15 01:30:02

+0

@ggregoire,是的我有一個用戶表。 – Cybrix 2011-03-15 01:30:59

+0

@Cybrix:看我的編輯。 – 2011-03-15 01:39:44

0

序列化是一個選項。我碰巧遇到了類似的情況,管理層希望報告最多的內容。所以我不得不查詢整個表並構建數組,然後從大型數組中做報告......並不是處理它的最好方法。

我更新了系統的表格,其中的字段/值列對應於正在使用的過濾器類型,然後是值。然後編寫一個函數將這些轉換爲查詢。

因此,在您的示例中,該表格中的「tag」,「php」,然後是「tag」,「database-queries」表示該用戶標識。

下面是類似我用什麼(編輯處理問題的變化):

CREATE TABLE `user_prefs` (
    `user_pref_id` int(11) NOT NULL AUTO_INCREMENT, 
    `user_id` int(11) NOT NULL, 
    `type` varchar(255) NOT NULL, 
    `condition` varchar(10) DEFAULT '=' NOT NULL, 
    `value` varchar(255) NOT NULL, 
    PRIMARY KEY (`user_pref_id`) 
); 

INSERT INTO `user_prefs` (`user_id`, `type`, `value`) VALUES ({UserA}, 'tag', 'php'); 
INSERT INTO `user_prefs` (`user_id`, `type`, `value`) VALUES ({UserA}, 'tag', 'database-queries'); 
INSERT INTO `user_prefs` (`user_id`, `type`, `value`) VALUES ({UserB}, 'tag', 'html'); 
INSERT INTO `user_prefs` (`user_id`, `type`, `condition`, `value`) VALUES ({UserB}, 'comments', '>', '1'); 

當時我能夠運行在普通的搜索報告等工作對我來說更好反正。

+0

感謝您的解決方案。我編輯了我的問題。讓我的問題變得更加複雜。 – Cybrix 2011-03-15 02:23:02

+0

也許可以添加一個'condition'列,它將包含類似'!='或'>'的東西,並根據可能的條件以及默認的'='條件創建一個函數來構建查詢......但是,可能是更優雅的解決方案。 – 2011-03-15 02:30:58