我有定价规则来确定要给客户多少折扣。问题是我需要很多规则,例如约10,000条规则,如果我为每个客户请求循环所有10,000条规则,性能将会非常慢。
要申请某些折扣,我需要检查很多条件:
- Product type (clothes, electronics, etc)
- Product SKU
- Customer location
- Search date (e.g. >= 2019-01-01 And <= 2019-01-31)
- .
- .
- .
- ~30th conditions
以下是我要设置的规则示例:
Rule 1: product type = 'clothes', then discount 10%
Rule 2: product type = 'electronics', then discount 5%
Rule 3: product type = 'clothes' AND customer location = 'AUSTRALIA', then discount 7%
.
.
.
Rule 10,000: ....
我还要使每个规则具有优先权。因此,如果规则3的优先级高于规则1,我想使用规则3进行折扣。
天真的方法是循环所有10,000条规则,并逐一检查每个规则是否符合条件。但是性能会很差。如果我想再添加10,000条规则,该怎么办?
我很想知道是否有更好的方法来代替循环所有规则。
---更新 每当用户进行搜索时,都需要触发此规则。有一个搜索栏,用户可以输入要查找的关键字,该页面将返回所有与关键字匹配的产品。结果最多可以搜索到50种产品,因此我们需要评估50倍的规则,以适用于每种用户搜索的每种产品。
答案 0 :(得分:1)
这可能有点过大,但是当我考虑速度时,我认为Hash Tables中,唯一规则存储为(rule, discount)
对。
要执行此操作,您需要对规则条件进行分类(产品类型,国家/地区等)。其次,您需要为每个类别的每个成员分配一个数字(枚举):
Countries[Australia = 1, New Zealand = 2, ...]
然后,将具有多个可接受条件的所有规则拆分为单独的规则:
Rule 3: product type = 'clothes' AND (customer location = 'AUSTRALIA' OR customer location = 'NEW ZEALAND'), then discount 7%
成为
Rule 4: product type = 'clothes' AND customer location = 'AUSTRALIA', then discount 7%
Rule 5: product type = 'clothes' AND customer location = 'NEW ZEALAND', then discount 7%
现在,您需要检查一系列条件。如果未指定,则可以保留零。例如,条件数组:
[product type, customer location, month]
您可以拥有价值
['decorations', '', 'December']
翻译成
[23, 0, 12]
,如果您总共要检查8种类型的条件,那么您将拥有一个看起来像这样的最终数组
[0, 0, 0, 23, 0, 0, 12, 0]
现在是通过以某种形式在数组上执行hash function H()
来检查适用于此规则的特定规则的时候了。您可以将数字串在一起:
=H(0002300120)
或者您可以将每个连续的数字乘以10的更大的幂,然后将它们加在一起(由于2 64 的限制,少于25个标准):
=H(230000 + 120000000)
哈希表的优点在于,如果它们有足够的开头空间并且具有良好的哈希函数O(1)
和collision resolving机制,它们几乎可以立即与H()
一起工作(因为并非所有H()
每次都可能是唯一的。