【问题标题】:Efficient filter query for filtering on 80+ columns用于过滤 80 多列的高效过滤器查询
【发布时间】:2020-11-08 14:50:08
【问题描述】:

有一个车辆搜索系统,用户可以选择他们选择的汽车,并提供许多过滤选项,如品牌、型号、颜色、安全气囊、空调等功能。有用于选择品牌、型号的下拉菜单,而功能显示为复选框。还有一个字段显示符合该标准的汽车总数。假设一开始有 100 辆汽车。当用户选择品牌为 BMW 时,计数会更新为 47。现在,如果用户再次点击安全气囊(BMW + 安全气囊),则总数会更新。

功能总数为 90。我正在使用 PostgreSql,所有功能都存在于一个表中。我想构建一个动态查询,它应该根据用户的偏好过滤数据。我的方法是为所有 90 个功能设置过滤条件,并将用户选择作为参数传递给 PostgreSql 函数。

select count(vehicle_id)
from vehicles
where brand in(...,...,...)
and flag_airbag in(..,..)
and flag_airconditioner in(..,..)
and ....
and .....

我相信应该有更好的方法来实现这一点。任何建议表示赞赏。 谢谢。

【问题讨论】:

  • 你的做法很合理。您只需要在未选择选项时小心 - 用 in 表示“全部”相当棘手。

标签: sql postgresql


【解决方案1】:

这可行,但您需要所有搜索条件的索引。

并且您必须确保用户输入至少一个选择性标准,否则(除非表很小),您的查询将花费很长时间。

一张表有 90 个索引简直是疯了。您将无法以合理的性能对表进行任何数据修改。

一种方法是对数据进行某种程度的规范化:例如,模型始终属于特定品牌,因此您可以拥有至少三个表 carmodelbrand,并将 90 个属性分布在这些表。

我的建议是始终强制用户输入至少一两个选择性条件并在这些条件上建立索引。然后您可以使用更少的索引,并且使用会更满意,因为没有人愿意等待很长时间等待响应然后获得 10000 个结果行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-27
    • 2022-01-20
    • 2018-03-26
    • 2021-01-12
    • 1970-01-01
    相关资源
    最近更新 更多