在数据库中存储“已保存的搜索”的最佳做法是什么?

时间:2008-11-10 20:14:58

标签: database-design

我正在开发一个搜索页面,允许用户搜索待售房屋。典型的搜索条件包括价格/邮政编码/#卧室等。

我想允许用户将此条件保存在数据库中,并每天通过电子邮件发送新家。

我可以:

1)将“SavedSearch”对象序列化为字符串并将其保存到数据库中,然后根据需要进行反序列化。

2)在tblSavedSearch中列出与搜索条件对应的列 - price / zip /#bedrooms / etc.

我担心如果我选择选项1,我保存的搜索条件将会更改并使数据库中的搜索对象无效,但选项2也不是最佳解决方案。

其他人如何解决这个问题?

8 个答案:

答案 0 :(得分:5)

我假设您需要每天重新运行搜索,以便找到结果的新增内容。也许可以确保搜索表单指定了一个get方法,以便将搜索条件作为查询字符串附加到url,然后将整个查询字符串保存在数据库中。

因此,如果您有一个名为search.action的搜索程序,您将按如下方式请求搜索:

search.action?price=20000&rooms=3

您可以将 price = 20000& rooms = 3 部分保存到数据库中。要检索此搜索,只需将查询字符串附加到网址上,然后再次请求搜索页面。

唯一需要注意的是,当搜索操作发生变化时,您必须进行智能默认设置以避免破坏旧搜索。例如,假设您开始按颜色搜索,旧的搜索都没有颜色标准,因此您的搜索操作必须满足此要求,并确保使用合适的颜色,例如所有颜色。

答案 1 :(得分:3)

表用户

表格标准(=提供的搜索条件列表)

表SavedSearch(用户详细信息)

表SavedSearchCriteria,SavedSearch的详细信息,引用条件,列SearchValue保存用户为输入的每个条件输入的值

答案 2 :(得分:1)

我会选择#1。如果您真的担心标准会发生变化,可以使用“搜索版本”属性进行存储,并在必要时按下序列化表示。

#2不会扩展到任何用途。例如,如果你想对搜索条件进行任何类型的布尔分组,那么你的数据库模式就会点燃自己的火焰,然后大喊大叫。

我通常通过将索引/搜索从数据库中删除来解决搜索问题。对于你所谈论的内容来说,这可能有点过头了,但是RDBMS并不适合搜索。

答案 3 :(得分:0)

您可以将动态SQL本身作为文本字符串保存在数据库中。然后,您将不必完成从保存的键值对重新创建WHERE和IN以及其他SQL的所有操作。

您可以使用保存的SQL并在生成电子邮件时运行它。

如果您的数据库设计不够稳定,无法保存查询信息,则可能需要推迟搜索设计,直到数据库设计更加成熟为止。

答案 4 :(得分:0)

我认为这两种方法都有意义,而且都取决于要求(当前和未来)。

例如,如果搜索次数很多,并且您需要分析它们(例如,回答问题,例如“人们搜索每个卧室的频率?”),存储搜索及其关系形式的标准(您的选项#2)将是合适的。

但是如果你没有任何迫切要求使用选项#2,那么序列化没有任何问题,恕我直言。请确保您不会破坏与现有数据的兼容性,因为搜索条件的结构会随着时间的推移而变化。 (顺便说一句,向后兼容性问题并非特定于选项#1 - 即使在使用选项#2时也可能出现这种情况。)关键点是:您始终可以从选项#1切换到选项#2,并且可以通过这种切换进行拖延只要认为实用。

答案 5 :(得分:0)

我还会为解决方案添加数据可见性...... 表用户 - 包含用户 表角色 - 包含db中的角色 表UserRoles - 一个用户在会话中可能有一个或多个角色 表MetaColumns - 包含db中所有列/视图的元信息 Table ControllerMetaColumns - 每个UserRole的每个MetaColumns的可见性,用户总是必须通过这个访问实际数据(INNER JOIN) Table TableViewToSearch - 用于执行搜索的表或视图 表SavedSearch - 具有属性ControllerMetaColumnsId,TableViewToSearchId,SavedSearchString - 如果Role没有访问属性,它将被赋予空结果集

答案 6 :(得分:0)

实现此目标的最佳方法是将搜索条件存储为XML。这样,您就可以轻松地引用搜索条件,并为用户提供在需要时进行更改的功能。

XML应该是最具扩展性的解决方案,我将避免将URL参数传递给操作。这可能是一个简单的解决方案,但会遇到以下问题。

  1. 如果用户想要编辑新的搜索条件,那么我们必须进行大规模的字符串操作。

  2. 存储复杂的搜索条件将是一个问题。如果我想保存复杂和/或条件怎么办? (在XML中,由于它已经是分层的,我可以存储我需要的所有信息)。

  3. 解决方案可以扩展,并且还可以通过Sql注入攻击清理您的应用程序。

  4. 由于XML是一种成熟的技术,因此您可以使用它来执行验证,然后再将其传递到后端。

答案 7 :(得分:-3)

如果我可以建议,请使用包含搜索结果的html页面(如果它包含中等数量的记录)。并且,将其路径与DB中的搜索条件一起存储到

这将避免查询数据库。

编辑:我假设记录不会经常变化。 如果是,最好将搜索条件存储在数据库中,并在用户询问时进行查询。