在数据库中存储搜索条件

时间:2009-07-16 05:03:13

标签: java database-design

我正在对Flex仪表板进行增强,以便用户保存搜索。我在服务器端使用BlazeDS和Java / Spring / SpringJdbc。

我的问题是:您如何为具有一个或多个条件的搜索建模,例如:

  • 2009-10-01至2009-10-31之间的价值日期
  • 货币='美元'
  • 银行名称以'First'开头

我的第一个尝试是将标准分为3种类型:

  • 数字标准
  • 日期标准
  • 字符串标准

每种标准类型都有一组不同的比较运算符:

  • 数字运算符:=,>,> =,<,< =,<>
  • 日期运算符:之前,之后,之间
  • 字符串运算符:以Ends开头,包含

我有代码来识别这些运营商。

我的对象模型是一个SearchCriteria接口和3个实现它的类:NumericCriteria,DateCriteria和StringCriteria

所有这些类都使用以下列映射到同一个表:

 - SAVED_SEARCH_ID: id of the saved search
 - SEQ_NUM: criteria order. We want to load the criteria in the same order each time
 - CRITERIA_TYPE: Operator code. I can use this later to determine what kind of criteria this is.
 - FIELD: currency, valueDate, bank, etc
 - FIRST_VALUE_NUMERIC
 - SECOND_VALUE_NUMERIC
 - FIRST_VALUE_DATE
 - SECOND_VALUE_DATE
 - FIRST_VALUE_STRING
 - SECOND_VALUE_STRING

有更清洁的方法吗?我并不是对数据模型感到疯狂,但我找不到关于这个主题的任何资源...所有评论都表示赞赏,无论多么残忍:)

4 个答案:

答案 0 :(得分:4)

您可以将条件类序列化为XML并保留XML,而不是实现庞大的架构。

答案 1 :(得分:2)

也许你可以从Hibernate Criteria API获得灵感。它为类型安全查询提供了一个完整的模型,它本身可能使用JPA / Hibernate本身映射到数据库。

答案 2 :(得分:0)

以SQL格式本身存储整个搜索条件是否有任何损害。不确定您的其他参数是什么考虑您提到的方法。

答案 3 :(得分:0)

如果您正在使用JDBC,则可以将SQL语句存储为字符串(或者可能只存储在where子句中)。每次运行时都需要准备查询,如果查询量非常高,这可能是一个问题。但这比试图将where子句分解为成分标记要容易得多。

如果采用这种方法,请小心防范SQL注入攻击(在查询中放置的不仅仅是where子句 - 比如DROP TABLE)。