关于数据库设计:需要模式以动态搜索多个sql表

Need Pattern for dynamic search of multiple sql tables

我正在寻找一种用于对多个表执行动态搜索的模式。

我无法控制旧式(设计欠佳)的数据库表结构。

考虑一种类似于履历搜索的方案,其中用户可能希望对履历中的任何数据执行搜索,并获取符合其搜索条件的履历列表。可以随时搜索任何字段,并将其与一个或多个其他字段组合在一起。

根据要搜索的字段动态创建实际的sql查询。我发现的大多数解决方案都涉及复杂的if块,但是我不禁要认为必须有一个更优雅的解决方案,因为到目前为止这必须是一个已解决的问题。

是的,所以我已经开始动态地在代码中构建sql了。看起来真令人讨厌。如果我真的尝试支持请求的功能来查询任何表中任何字段的任何组合,那么它将成为一组大量的if语句。颤抖

我相信我读到COALESCE仅在您的数据不包含NULL的情况下有效。那是对的吗?如果是这样,那就别走了,因为我到处都是NULL值。


据我了解(而且我也是针对可怕的旧数据库编写的人),没有动态WHERE子句之类的东西。尚未解决。

我个人更喜欢在代码中生成动态搜索。使测试方便。请注意,在代码中创建sql查询时,请勿在用户输入中串联。使用您的@variables!

唯一的选择是使用COALESCE运算符。假设您有下表:

1
2
3
4
Users
-----------
Name nvarchar(20)
Nickname nvarchar(10)

,您可以选择搜索姓名或昵称。以下查询将执行此操作:

1
2
3
4
5
SELECT Name, Nickname
FROM Users
WHERE
    Name = COALESCE(@name, Name) AND
    Nickname =  COALESCE(@nick, Nickname)

如果您不想搜索某些内容,只需输入一个null。例如,为@name传递" brian ",为@nick传递null将导致对以下查询进行评估:

1
2
3
4
5
SELECT Name, Nickname
FROM Users
WHERE
    Name = 'brian' AND
    Nickname =  Nickname

合并运算符将null转换为一个身份评估,该评估始终为true,并且不影响where子句。


您需要的是SphinxSearch(对于MySQL)或Apache Lucene。

如您在示例中所述,让我们想象一个由多个字段组成的简历:

  • 项目清单
  • 名称,
  • 承认,
  • 教育(可能是一张桌子)或
  • 工作经验(可以增长到自己的表中,其中每一行代表以前的工作)

因此,使用WHERE在所有这些字段中快速搜索单词将成为一个很长的查询,需要多个JOINS。

相反,您可以更改参考框架,并将整个简历视为单个文档,而您只想搜索所述文档。

这是Sphinx Search之类的工具所处的位置。他们创建\\\\ document \\的FULL TEXT索引,然后您可以查询sphinx,它将返回数据库中找到记录的位置。

非常好的搜索结果。

不用担心这个工具不是您的RDBMS的一部分,使用此应用程序的适当模型" Documents "与不正确的模型" TABLES "相比,它将为您省去很多麻烦。 >


搜索和规范化可能会相互矛盾。因此,可能第一件事就是获得某种"视图",该视图显示所有可以通过单键搜索为单行的字段,从而获得简历。然后您可以在其前面添加诸如Lucene之类的内容,以为这些行提供全文索引,有效的方法是,在此视图中向其要求" x ",它会向您返回密钥。这是一个很好的解决方案,乔尔本人在IIRC的前两个月内就在播客中推荐了该指南。