2012-12-10 46 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需要知道什麼樣的數據類型要返回,所以你可能會遇到這方面的一些困難(在繼續之前仔細閱讀文檔)和如果準備好的語句得到你需要去的地方,那可能會更簡單。