3

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

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

我的问题:关于如何实施要求 2 的任何建议/建议/提示?
是否有现有的设计模式、sql 查询、内置的 db 函数来说明如何保存查询并从最后返回的结果中从多个表中获取信息。

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

为了存储用户和查询 ID 信息,我正在考虑创建一个单独的表来存储 UserName、UserUUID、SavedQuery、LastInfoRetrieved。

谢谢。

4

1 回答 1

1

这是一个相当大的问题。在这里使用的明显工具是准备好的语句,但由于这些是在首次运行时计划好的,因此在使用多个参数多次运行时可能会遇到问题。考虑差异,假设 id 介于 1 到 1000000 之间:

SELECT * FROM mytable WHERE id > 999900;

SELECT * FROM mytable WHERE id > 10;

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

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

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

从您所说的来看,refcursors 听起来像是执行此操作的方式,但请记住 PostgreSQL 需要知道要返回的数据类型,因此您可能会在这方面遇到一些困难(在继续之前仔细阅读文档),以及准备好的语句是否得到你需要去的地方,那可能更简单。

于 2013-02-20T01:31:39.460 回答