2011-03-29 32 views
4

假設有一個桌面應用程序 - 可以最好地描述爲用戶插入/查看記錄的記錄 - 依賴於DB後端,該後端將包含對象的層次結構和屬性。如何處理數據檢索?帶數據庫的桌面應用程序 - 如何處理數據檢索?

如果所有的數據是在啓動時加載並存儲在以後的操作還是應該將數據只需要檢索相應的類/結構,存儲在模擬式類/結構,再後來重用而不是再次被要求到數據庫?

就我所見,前一種方法需要使用更大的存儲器部分,並且可能在啓動時等待時間(如果顯示啓動畫面,則不會太差),而後者可能會使用戶延遲在處理期間由於數據檢索而需要在數據庫上執行一些昂貴的查詢,其結果和/或支持數據結構一旦被使用就很可能無用*。

有些東西告訴我,解決方案在於深入分析,這將導致上面列出的兩種方法基於最常用的數據的混合,但我非常有興趣閱讀您的想法,技巧和現實生活關於這個話題的經驗。

爲了討論的緣故,我正在考慮C++和SQLite。

謝謝!

* 假設您可以對類/對象執行更快的操作,而不必對數據庫執行復雜的查詢。

編輯

一些額外的細節:

  • 沒有併發訪問數據,這意味着只有1個用戶工作在其本地存儲的數據。
  • 根據所做的更改發回數據人爲地 - 即低頻率。這對於從數據庫讀取數據來說並不一定是正確的,在那裏我可以預計有幾個高峯期的大量讀取,我希望快速。
  • 我最害怕的是用戶在顯示一個複雜的記錄時(因爲必須從數據庫中讀入)纔會感覺到緩慢。

回答

1

使用Lazy LoadData Mapper(pg.165)模式。

+0

書中只有87頁!你怎麼能得到第165頁? – 2013-03-21 00:46:34

+0

書中有500多頁。 – bancer 2013-03-21 00:52:10

1

我覺得這個問題依賴於太多的變量才能夠給出具體的答案。你應該首先考慮的是你需要從數據庫中讀取多少數據到應用程序中。此外,您多久將數據發送回數據庫並要求新數據?此外,用戶是否將同時處理數據?如果是這樣,最初加載數據可能不是一個好主意。

經過您的編輯,我會說這可能會更好地將數據留在數據庫。如果您打算以相對較低的頻率訪問它,則沒有理由在啓動時加載或以其他方式嘗試將其緩存在應用程序中。當然,只有你最瞭解你的應用,並且應該決定可以預先加載哪些位以提高性能。

+0

在上面增加了一些進一步的細節。 – JoeSlav 2011-03-29 19:23:09

+0

感謝皮特的意見。確實,我會以低頻發回數據,但不一定我會以低頻率讀取數據(例如,類似樹的操作,需要使用其屬性獲取大量節點等)。我最害怕的是用戶在顯示一個複雜的記錄時感到緩慢(因爲它必須從db讀入)。 – JoeSlav 2011-03-29 19:34:56

+0

你可以做某種「預取」嗎?很多時候可以告訴用戶在記錄保存應用程序中需要「下一步」。例如,如果您的用戶正在編輯某個項目,並且位於他們需要輸入信息的屏幕上,然後才能轉到其他屏幕。你知道這個用戶很可能會移動到下一個屏幕,以便在第一個屏幕上顯示信息時在後臺獲取必要的數據。有很多方法可以讓數據傳輸過程對於最終用戶來說是相當透明的。 – Pete 2011-03-29 19:38:08

0

您可能會考慮在用戶中間服務器(WCF)中包含內存中數據庫的緩存數據,這樣用戶不必每次都訪問數據庫。另外,因爲如果有人更改/添加記錄,所有用戶只有一個訪問點,您也可以更新緩存。靜態數據可以每x小時重新加載一次(例如每小時)。它仍然可能不是最好的選擇,因爲數據需要從服務器編組到客戶端,但是如果可以的話,您可以使用netTcp綁定,這是快速和小型的。

+0

謝謝弗拉德。不幸的是,我覺得這種情況遠遠超出了桌面應用程序場景(即沒有網絡),即使我實現了從內存中獲取這樣一箇中間層,我只是將「加載」問題轉移到另一個地方/時刻。 – JoeSlav 2011-03-29 20:02:56

相關問題