我正在设计一个数据库和一个Java应用程序,目的如下:
一。允许用户通过api查询数据库。
2.允许用户保存查询并通过“查询ID”标识查询。然后,用户可以在下一次调用api时传入“query id”,api将执行与id相关联的查询,但它将只检索上次请求特定查询时的数据。
-除此之外,我还需要保存每个用户id的查询id信息。
有关数据库的信息
选择的数据库是postgresql,用户需要的信息将存储在不同的表中。
我的问题:关于如何实施需求的任何建议/建议/技巧
2号?
是否存在现有的设计模式、SQL查询、内置的DB函数,如何从最后返回的结果中保存查询并从多个表获取信息。
注:
到目前为止,我最初的想法是将从每个表中读取的最后一行(所有表中的每一行都有一个主键)存储到一个数据结构中,然后为每个保存的查询保存此数据结构,并在再次检索数据时使用它。
为了存储用户和查询id信息,我考虑创建一个单独的表来存储用户名、useruuid、savedquery和lastinformetrieved。
谢谢。
最佳答案
这真是个问题。这里使用的明显的工具是准备语句,但是由于这些语句是在第一次运行时计划的,所以当使用多个参数多次运行时,它们可能会遇到问题。考虑一下区别,假设id的范围是1到1000000:
SELECT * FROM mytable WHERE id > 999900;
和
SELECT * FROM mytable WHERE id > 10;
第一个应该使用索引,而第二个应该对表进行物理顺序扫描。
第二种可能是函数return refcursors。这意味着查询实际上是在返回refcursor时运行的。
第三种可能是在每个会话中有一个表的模式,用于保存结果。理想情况下,这些表应该是pg_temp中的临时表,但是如果必须跨会话保存,则可能不太理想。建立这样一个解决方案是更多的工作,并增加了许多复杂性(阅读:可能出错的事情),所以这是一个真正的最后选择。
从你所说的来看,refcursors听起来像是这样做的,但是要记住postgresql需要知道要返回什么数据类型,这样你就可以在这方面遇到一些困难(在继续之前彻底阅读文档),如果准备好的语句可以到达你需要的地方,那可能会更简单。