3

私はデータベースと Java アプリケーションを次のように設計しています。
1. ユーザーが API を介してデータベースにクエリを実行できるようにします。
2. ユーザーがクエリを保存し、「クエリ 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;

1 つ目はインデックスを使用し、2 つ目はテーブルの物理順序スキャンを実行する必要があります。

2 つ目の可能性は、refcursors を返す関数を持つことです。これは、refcursor が返されたときにクエリが実際に実行されることを意味します。

3 番目の可能性は、セッションごとに結果を保持するために使用できるテーブルのスキーマを持つことです。理想的には、これらは pg_temp の一時テーブルになりますが、複数のセッションにわたって保持する必要がある場合は、あまり望ましくない可能性があります。このようなソリューションを構築することは、より多くの作業と多くの複雑さを追加するため (読み取り:問題が発生する可能性があることを参照)、実際には最後の選択です。

あなたの言うことから、refcursors はこれを行う方法のように聞こえますが、PostgreSQL は返すデータ型を知る必要があるため、この点でいくつかの問題が発生する可能性があることに注意してください (続行する前にドキュメントをよく読んでください)。どこに行く必要があるか、それはより簡単かもしれません。

于 2013-02-20T01:31:39.460 に答える