我应该将此过滤放在SQL或我的应用程序代码中吗?

时间:2015-08-03 11:28:39

标签: sql database web

假设我的网络应用程序中有以下模型:

Table User:
   (attr1, attr2, attr3, ...)
Table Prize:
   (condition1, condition2, condition3, prize_val)

应用程序逻辑是:如果用户满足奖品的所有条件,我想授予他奖品。条件可以是NULL(所有用户都为True)或特定值。可以使用用户属性计算每个条件。我可以通过两种方式进行过滤:

  1. 从数据库中获取所有奖品规则(最多100个),并在我的应用程序代码中迭代规则,检查当前用户是否满足规则,以获得奖品清单。
  2. 用户SQL进行这样的过滤:

    SELECT prize from Prize where (condition1=NULL or condition1=user_condition1) and (condition2=NULL or condition2=user_condition2) ...

  3. 我的问题是:哪一个更有效率?

    更普遍的问题是:什么时候在应用程序代码中进行过滤而不是SQL?

    PS。我甚至考虑代码中的迭代的原因是:如果我在代码中迭代,并且条件1对于奖品是NULL,我不需要为用户计算condition1值(这种计算可能很昂贵);但是如果我采用SQL方法,我必须为用户预先计算每个条件值。

3 个答案:

答案 0 :(得分:4)

经验法则:与代码中的SQL Query进行比较时,iterations总是更有效率。

关于过滤 - 当您在SQL上过滤时,它会返回的数据少于您在应用中过滤的数据。另外,我认为query中的过滤器比code中的过滤器快。

答案 1 :(得分:1)

  1. 您有一个条件矩阵,每行都有奖品。

  2. 条件值可随奖金值

  3. 随时间变化

    因此,建议保留在数据库中。 数据应该在数据库中,逻辑应该在代码中。 在您的情况下,条件是提供更改的数据。但逻辑仍然不变。

    希望我很清楚。

答案 2 :(得分:1)

您的奖品表未正常化。我看到与条件的一对多关系。

当你这样做时,你的过滤器是一个Join而不是更复杂的WHERE子句。

在任何一种情况下,我认为这最好由数据库完成。您需要注意处理主键。如果未正确编制索引,您的查询将表现不佳。