假设我的网络应用程序中有以下模型:
Table User:
(attr1, attr2, attr3, ...)
Table Prize:
(condition1, condition2, condition3, prize_val)
应用程序逻辑是:如果用户满足奖品的所有条件,我想授予他奖品。条件可以是NULL(所有用户都为True)或特定值。可以使用用户属性计算每个条件。我可以通过两种方式进行过滤:
用户SQL进行这样的过滤:
SELECT prize from Prize where (condition1=NULL or condition1=user_condition1) and (condition2=NULL or condition2=user_condition2) ...
我的问题是:哪一个更有效率?
更普遍的问题是:什么时候在应用程序代码中进行过滤而不是SQL?
PS。我甚至考虑代码中的迭代的原因是:如果我在代码中迭代,并且条件1对于奖品是NULL,我不需要为用户计算condition1值(这种计算可能很昂贵);但是如果我采用SQL方法,我必须为用户预先计算每个条件值。
答案 0 :(得分:4)
经验法则:与代码中的SQL Query
进行比较时,iterations
总是更有效率。
关于过滤 - 当您在SQL
上过滤时,它会返回的数据少于您在应用中过滤的数据。另外,我认为query
中的过滤器比code
中的过滤器快。
答案 1 :(得分:1)
您有一个条件矩阵,每行都有奖品。
条件值可随奖金值
因此,建议保留在数据库中。 数据应该在数据库中,逻辑应该在代码中。 在您的情况下,条件是提供更改的数据。但逻辑仍然不变。
希望我很清楚。
答案 2 :(得分:1)
您的奖品表未正常化。我看到与条件的一对多关系。
当你这样做时,你的过滤器是一个Join而不是更复杂的WHERE子句。
在任何一种情况下,我认为这最好由数据库完成。您需要注意处理主键。如果未正确编制索引,您的查询将表现不佳。