2017-01-09 59 views
1

是否有可能「記住」某個時間點,併爲其指定一個標識符,以便日後可以在查詢中引用它,並從數據庫中獲取結果,然後呢?在某個以前的時間點執行查詢

如果存在這樣的機制,它有多輕巧?每秒產生幾十個「快照」是否可以接受?

我認爲我可以通過交易來揭示他們的ID,但我擔心這是太重的重量,我不確定一個交易是否可以退出但不被破壞。

+0

你想提交一個sql語句,但帶回匹配特定時間點的結果嗎?這些結果是否存在於您的數據中,或者您希望有一些機制讓他們記住? – JNevill

+0

我只能想到做一個數據庫轉儲:)即使交易僅限於您所觸及的記錄。 (而且它們有一個上限。) –

+0

如果我的解釋是正確的,那麼這是你數據的一個函數。您是否爲每條記錄存儲歷史記錄並保存有效期限(valid_from,valid_to)?我相信Postgres有一個臨時表擴展使其接近[https://en.wikipedia.org/wiki/SQL:2011#Temporal_support],但是您正面臨很多工作需要更新你的模式。 – JNevill

回答

1

您無法訪問您不保留的數據,但有一些模式設計方法可以讓您執行此類操作。如果您真的感興趣,請閱讀雙時態表和SQL:2011。兩本很好的書籍是由湯姆約翰斯頓開發的Richard Snodgrass(也可作爲free PDF on his website)和Bitemporal Data開發SQL中的面向時間的數據庫應用程序。

一種較不科學的方法,它不是bi -temporal但讓您訪問舊數據,在this talk from 2015中描述。

另一種也不是雙時間的方法是使用temporal_tables extension(與github here)。

我認爲最大的挑戰是處理舊數據,因爲隨着時間的推移,您的模式會發生變化。例如,您添加一個新的NOT NULL列。你如何處理所有的舊記錄?據我所知,無論是在研究中還是在工具中,都沒有多少解決這個問題。

+0

在我的用例中,快照不會持續很長時間。當然不是通過模式更改。 –

+0

在這種情況下,我會考慮從PGConf US 2015(YouTube鏈接)的談話。這似乎很容易設置,你可以經常清除舊數據。 –