我习惯了使用以下
进行数据库搜索的传统方式但在其他时候,我发现这些常用的方法可以产生如此臃肿的代码,特别是在涉及复杂的搜索时。
您是否有用于复杂数据库搜索的算法?我试图寻找一些,但很难这样做。我偶然发现二进制搜索,但我找不到它的用途:(
编辑:这是我正在处理的搜索的伪代码。它使用jquery范围滑块进行最大和最小搜索
query = 'select * from table'
if set minprice and not set maxprice
if minprice = 'nomin'
query += ' where price < maxprice'
else
query += ' where price < maxprice and price < minprice'
if not set minprice and set maxprice
if maxprice = 'nomax'
query += ' where price > minprice'
else
query += ' where price > minprice and price < maxprice'
if set maxprice and set minprice
if maxprice = 'nomax'
query += ' where price > minprice'
else
query += ' where price > minprice and price < maxprice'
这可能不是您建立答案的代码库。我正在寻找更优雅的数据库搜索方式。
优雅的编辑我指的是重写代码的方法,以便在更少的代码行中实现更快的查询
答案 0 :(得分:0)
记住查询的速度不仅仅是查询本身。此外,很大程度上取决于数据库的结构。这是一个标准的关系布局,还是一个明星,或者?您的密钥是否已编入索引,是否有二级索引?您是期望带回大量数据,还是仅仅几行?您是在搜索数据库必须进行文本搜索的列,还是数字值。当然,除此之外,数据库是如何实际铺设的?在单独的驱动器上索引和重击表?等等。像前面提到的人一样,也许一个具体的例子在尝试解决时会更有帮助
答案 1 :(得分:0)
好吧,我仍然不太清楚你想要什么,但我会试一试......
如果您正在尝试加快查询速度,则无需担心“改进的算法”。只需确保您正在搜索的任何列(示例中为price
)都有索引,数据库将负责有效搜索。我保证,它非常擅长。
至于减少代码量,再说一次,我不能说每个案例,但是你的上面的伪代码是膨胀的,因为你多次处理完全相同的情况。我的代码就像这样(伪代码,没有特定的语言):
if (set(minprice) and minprice != 'nomin')
conditions[] = 'price > minprice'
if (set(maxprice) and maxprice != 'nomax')
conditions[] = 'price < maxprice'
query = 'select * from table'
if (notempty(conditions))
query += ' where '+conditions.join(' and ')
答案 2 :(得分:0)
当与数据库连接时,使用复杂而丑陋的查询比使用“优雅”查询更好,您可以在应用程序中复制数据库搜索功能。每次调用数据库都有与之相关的成本。如果您编写代码来搜索应用程序中的数据库,那么它几乎可以保证更昂贵。
除非您实际编写数据库(高阶),否则请让数据库进行搜索。
答案 3 :(得分:0)
尝试专注于重新组织您的查询构建过程。
query = select +'where'+ filter1 + filter2
select = 'select * from table'
filter1 = '';
if set minprice
if minprice = 'nomin'
filter1 = price > minprice'
else
filter1 = 'price < minprice'
依此类推......直到构建完整的查询:
query = select;
if any filter on
query += ' where '
first = true
if set filter 1
if not first
query += ' and '
query += filter1
依旧......
您可以将过滤器放在一个数组中。它对您的代码更具“可扩展性”。
答案 4 :(得分:0)
您的代码存在的主要问题是它会对set(minprice)
和set(maxprice)
的所有可能组合进行不必要的考虑,而它们可以独立处理:
query = 'select * from table'
conditions = [] #array of strings representing conditions
if set(minprice):
conditions.append("price < minprice")
if set(maxprice):
conditions.append("price > maxprice")
if len(conditions)>0:
query += ' WHERE ' + " and ".join(conditions)
通常,将生成条件(上面的if set(...)
行)与构建实际查询分开是有益的。这样,您不需要单独的if
在每个生成的条件之前生成(或跳过)"AND"
或"WHERE"
,而是可以在一个地方处理它(最后两个)上面的行)根据需要添加中缀。