2012-12-10 118 views
2

检索数据我设计一个数据库和Java应用程序如下:
1.允许用户通过一个API查询数据库。
2.允许用户保存查询并通过'query-id'识别查询。然后,用户可以在下一次调用API时传入“query-id”,API将执行与id关联的查询,但只会从上次请求特定查询时检索数据。
- 除此之外,我还需要保存每个用户ID的查询ID信息。保存SQL查询,并从上次查询结果

关于数据库的信息
选择的数据库是PostgreSQL,用户请求的信息将存储在各种表中。

我的问题:任何建议/咨询/关于如何去实现要求 第2号的提示?
是否有一个现有的设计模式,SQL查询,内置的数据库函数如何保存查询和从最后返回的结果中获取多个表中的信息。

注:
我最初的想法到目前为止是从每个表中读取的最后一行(在所有表的每一行都会有一个主键)存储到数据结构,然后保存这个数据结构保存的每个查询并在再次检索数据时使用它。

存储用户和查询ID信息,我想创建一个单独的表来存储用户名,UserUUID,SavedQuery,LastInfoRetrieved的。

谢谢。

+2

#2的一个非常简单的解决方案是将查询和查询ID保存在表中的最后结果中,当您看到查询ID返回先前的结果,然后用新查询覆盖它们时 –

+0

@HunterMcMillen当query-id存在于api调用中,这意味着用户希望执行他们保存的查询并从上次停止返回数据。保存最后的查询结果而返回不是我想要做的。我希望我澄清这一点。 – rlito

+0

您的查询有多复杂?你的大纲建议每个结果集最多只包含一条记录,这是否正确?如果是,建立一个3个表格(简化符号)'user(uuid pk,name,sqid fk)','savedquery(sqid pk,querydesc)'和'result(uuid fk,valid,pk_table1 fk nullable,pk_table2 fk为空,...)'。这假定用户只能检索他们最新的查询结果。 “有效”适用于从已保存查询结果的一部分的数据库中删除数据的情况。删除代码将需要更新受影响的'pk_table'字段。 – collapsar

回答

1

这是一个相当的问题。这里使用的显而易见的工具将会准备好语句,但是由于这些语句是在第一次运行时计划的,所以在多次运行多个参数时可能会遇到问题。考虑差别,假设id取值范围为1〜1000000之间:

SELECT * FROM mytable WHERE id > 999900; 

SELECT * FROM mytable WHERE id > 10; 

第一应该使用的索引,而第二应执行表的物理顺序扫描。

第二种可能性是具有功能return refcursors。这意味着查询实际上在refcursor返回时运行。

第三种可能性将有可能被用于此表的模式,每个会话,拿着结果。理想情况下,这些将是pg_temp中的临时表,但如果您必须保留跨会话,那可能不太理想。构建这样的解决方案是一个很大的工作,并增加了很多复杂的(读:事情可能出错),所以它是一个真正的最后的选择。

从你所说的话来看,refcursors听起来像是这样做的方式,但要记住PostgreSQL需要知道什么样的数据类型要返回,所以你可能会遇到这方面的一些困难(在继续之前仔细阅读文档)和如果准备好的语句得到你需要去的地方,那可能会更简单。