我正在设计以下数据库和Java应用程序:
1.允许用户通过API查询数据库
2.允许用户保存查询并通过'query-id'标识查询。然后,用户可以在下次调用API时传入'query-id',这将执行与id关联的查询,但它只会检索上次请求特定查询时的数据。
- 除此之外,我还需要保存每个UserID的查询ID信息。
有关数据库的信息
选择的数据库是PostgreSQL,用户请求的信息将存储在各种表中。
我的问题:有关如何实施要求的任何建议/建议/提示 2号? 是否存在设计模式,sql查询,内置db函数,如何保存查询以及从上次返回的结果中获取多个表中的信息。
注意:
到目前为止,我最初的想法是将最后一行(所有表中的每一行都有一个主键)从每个表中读取到数据结构中,然后为每个保存的查询保存此数据结构,并在再次检索数据时使用它。
为了存储user和query-id信息,我想创建一个单独的表来存储UserName,UserUUID,SavedQuery,LastInfoRetrieved。
感谢。
答案 0 :(得分:1)
这是一个非常有问题的问题。这里使用的显而易见的工具将准备语句,但由于这些是在首次运行时计划的,因此当使用多个参数运行多次时,它们可能会遇到问题。考虑差异,假设id介于1到1000000之间:
SELECT * FROM mytable WHERE id > 999900;
和
SELECT * FROM mytable WHERE id > 10;
第一个应该使用索引,而第二个应该对表进行物理顺序扫描。
第二种可能性是具有return refcursors的功能。这意味着在返回refcursor时实际运行查询。
第三种可能性是拥有一个表格模式,每个会话都可以用来保存结果。理想情况下,这些将是pg_temp中的临时表,但如果您必须保留跨会话,那可能不太理想。构建这样的解决方案需要做更多的工作并增加很多复杂性(阅读:可能出错的事情)因此它实际上是最后的选择。
根据你的说法,反馈器听起来像是这样做的方式但请记住PostgreSQL需要知道要返回哪些数据类型,这样你就可以在这方面遇到一些困难(在继续之前仔细阅读文档),如果准备好的陈述到达你需要去的地方,这可能更简单。