数据库搜索的数据结构算法

时间:2010-03-31 21:22:14

标签: algorithm language-agnostic search

我习惯了使用以下

进行数据库搜索的传统方式
  1. 使用通配符进行术语搜索
  2. 使用where子句获取地址和名称等特定数据
  3. 但在其他时候,我发现这些常用的方法可以产生如此臃肿的代码,特别是在涉及复杂的搜索时。

    您是否有用于复杂数据库搜索的算法?我试图寻找一些,但很难这样做。我偶然发现二进制搜索,但我找不到它的用途:(

    编辑:这是我正在处理的搜索的伪代码。它使用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'
    

    这可能不是您建立答案的代码库。我正在寻找更优雅的数据库搜索方式。

    优雅的

    编辑我指的是重写代码的方法,以便在更少的代码行中实现更快的查询

5 个答案:

答案 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",而是可以在一个地方处理它(最后两个)上面的行)根据需要添加中缀。