【问题标题】:Saving a SQL query and retrieving data from last query result [closed]保存 SQL 查询并从上次查询结果中检索数据 [关闭]
【发布时间】:2012-11-27 12:53:00
【问题描述】:

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

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

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

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

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

谢谢。

【问题讨论】:

  • #2 的一个非常简单的解决方案是使用查询和查询 ID 将最后一个结果保存在表中,当您看到查询 ID 返回以前的结果时,然后用新的结果覆盖它们查询
  • @HunterMcMillen 当 api 调用中存在查询 ID 时,这意味着用户想要执行他们保存的查询并返回上次停止的数据。保存最后的查询结果并返回不是我想要做的。我希望我能澄清这一点。
  • 您的查询可以变得多复杂?您的大纲表明每个结果集最多只包含一条记录,对吗?如果是,则构建一组 3 个表(简化表示法)user(uuid pk, name, sqid fk)savedquery ( sqid pk, querydesc )result ( uuid fk, valid, pk_table1 fk nullable, pk_table2 fk nullable, ...)。这假设用户只能检索他们最新的查询结果。 valid 适用于从数据库中删除已作为已保存查询结果的一部分的数据的情况。需要删除代码来更新受影响的pk_table 字段。

标签: java database postgresql database-design


【解决方案1】:

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

SELECT * FROM mytable WHERE id > 999900;

SELECT * FROM mytable WHERE id > 10;

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-16
    • 1970-01-01
    • 2012-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多