2009-11-19 18 views
5

我有一張100,000多名用戶(姓名,年齡,性別,電話,公司,街道,城市,州,國家,郵政編碼等)。如何使用MySQL表來表示規則?

我也有一個表提供給用戶的數千種促銷活動。現在,對於每次促銷,我需要添加一個規則來定義它適用於哪個用戶子集。

例如,規則可能是:具有10000至19999

一個郵政編碼另一個規則可能是所有用戶:這是女性,不居住在美國

然而,一個所有用戶第三條規則可能是:居住在DC,MD或VA的18歲以上的用戶。 等等

現在給一個特定的用戶,我想(高效地!)找出哪些促銷適用於該用戶。

考慮到我希望能夠在給定特定用戶的情況下快速找到匹配的促銷活動,對這些規則建模的好策略是什麼?

+0

既然是有共識的,我應該將我的規則存儲爲SQL查詢,是否有交互式構建此類查詢的工具?我正在運行PHP/CakePHP/MySQL。謝謝! – Sleepster 2009-11-19 01:37:06

回答

2

這是一種方法。

如果你可以將每個規則分解爲一個簡單的比較,那麼就可以像這樣將它存儲起來,以便適用於所有事情。最後是一系列規則項目,包括一個字段,一個值和一個比較(例如等於,不等於等)。他們也需要屬於一個實際的規則(你可以命名),這將在另一個表中列出。

現在變得複雜了。每個規則項目也是一個級別。這是因爲你可以做AND和OR比較,因爲他們需要一個heirarchy。我之前完成這個的方式是,即使水平AND和Odd水平OR。這意味着對於一個規則而言必須是真的兩個項目都將在第0級,也就是說,它們都必須驗證。對於具有一個強制性條件的規則以及兩個其中任一個可以爲真的規則,即1 AND(2 OR 3),則您將強制性規則置於級別0,其他兩級置於級別1.

此優點方法是組裝SQL過濾器的代碼獲得嵌套權,因爲它必須獲得正確的AND/OR模式。它還可以爲規則建立一個編輯器。

然而,這種解決方案,所有的其他人一樣,仍然需要輪流到用戶應用所有的規則集找到哪些規則讓你感興趣的用戶。

+0

這太棒了。謝謝! – 2017-07-12 00:14:17

1

這不是通常在數據庫級別執行的操作;相反,「規則」將由您的後端解釋(無論您在那裏使用哪種語言)。它們如何存儲在數據庫中取決於它們是如何建模的。這種方法可以簡單或複雜,因爲它需要是 - 規則可以由最終用戶動態定義等...

這就是說,如果你正在尋找快速和骯髒(與巨大強調骯髒)解決方案,您可以將規則存儲爲實際查詢(或查詢條件爲where)。然後您可以編寫存儲過程來應用所述規則。

2

接縫給我,你的規則可以真的是任何東西和更好地表示不同的查詢。

他們應該進入模型(MVC)也許到存儲過程。無法真正讓我的心靈在它上面。

每當一個新的推廣進了城,系統將遍歷所有用戶和比賽存入連接用戶和促銷活動的表。對於每個新用戶註冊也是如此。你也可以考慮把它放到cronjob中。

編輯:
請注意,如果你真的尋找性能的用戶直接鏈接到促銷表是至關重要的

只是我的兩分錢。

2

,如果你保存在「SQL-」的形態你的規則是什麼?例如,您已經提到了一個USERS表和一個PROMOTIONS表。

您可以添加2個新表,PROMOTION_RULE和PROMOTION_PROMOTION_RULE。該PROMOTION_RULE將包含規則,PROMOTION_PROMOTION_RULE將一個給定的推廣鏈接到其相關的規則(一個或多個)。此設計可讓您分享多個促銷活動的相同規則。

在PROMOTION_RULE,你可以存儲一個名爲RULE_SQL列,您可以存儲喜歡的值:

(gender != 'F' and country != 'US')  
(age > 18 and state IN ('DC','MD','VA') 

然後,你可以查找該申請晉升的規則,並動態構建一個由rule_sql值組成的SQL語句。

2

這取決於誰在輸入規則以及您對他們的信任程度。如果從字面上你是誰在添加規則,你可以將它們作爲SQL語句存儲在數據庫中,但這看起來很拙劣,或者作爲存儲過程,但我不確定是否可以有一個引用這些的列(它可以當然是一個字符串列)。

你沒有說你正在使用什麼樣的框架,但是如果你使用的是ORM,你的規則可能是查詢對象,它可以作爲BLOB序列化到數據庫。例如,如果您使用SQLAlchemy for Python,則每個規則都可以是您可以傳遞給User.filter函數的Query實例。

在所有這些情況下,您允許注入任意代碼,因此它們不適合允許其他人添加規則。唯一的好的解決方案將創建一個有限的特定於域的語言來表達規則,並將其轉換爲SQL或您的ORM語言。

+0

是的,我是增加規則的人。我看到了你對「規則語言」 - 查詢轉換的看法。關於定義這些規則和轉換爲SQL查詢的工具的任何線索? – Sleepster 2009-11-19 01:43:37