2010-02-12 105 views
0

我面臨着爲我的應用程序存儲某些參考數據(實質上是下拉值)的選擇。這些數據不會改變(或者如果是這樣,我需要重新啓動應用程序就沒問題),並且會經常作爲AJAX自動填充小部件的一部分進行訪問(因此可能會有一個用戶填寫一個數據領域)。我應該將參考數據存儲在我的應用程序內存或數據庫中嗎?

假設每個記錄看起來是這樣的:

category 
effective_date 
expiration_date 
field_A 
field_B 
field_C 
field_D 

自動完成的查詢需要檢查輸入字符串中的每個記錄4個領域和反對的類別和有效/到期日期離散參數,因此,如果這是一個SQL查詢,它將有一個WHERE子句,看起來像:

... WHERE category = ? 
AND effective_date < ? 
AND expiration_date > ? 
AND (colA LIKE ? OR colB LIKE ? OR colC LIKE ?) 

我覺得這可能是一個相當低效的查詢,但我想我不知道有足夠的瞭解數據庫如何優化自己的指標,等我知道很多真正聰明的人真的很難在這種確切類型的事情上使數據庫引擎真的很快。

我看到的另一種方法是將它存儲在我的應用程序內存中。我可以爲每個類別提供這些記錄的列表,然後遍歷類別中的每條記錄以查看是否滿足過濾條件。這絕對是O(n),因爲我需要檢查類別中的每條記錄。

有沒有人遇到類似的選擇?你有任何見解提供?


編輯:感謝您的洞察力,鄉親。將整個數據發送到客戶端並不是一個真正的選擇,因爲數據集非常大(幾MB)。

+0

對我來說,我會考慮在客戶端緩存數據。 – David 2010-02-12 22:13:14

+0

@David,真的有太多的數據要發送到客戶端,在那裏進行過濾。 – pkaeding 2010-02-12 22:30:04

回答

1

絕對緩存在內存中,如果它不是應用程序的生命週期內發生變化。你是對的,你不想回到數據庫的每個電話,因爲這是完全沒有必要的。可能會有關於服務器上緩存多少的爭論(我傾向於儘可能少地緩存直到我真的需要),但對於不會改變並且將被重複訪問的信息,您應該幾乎總是緩存在Application對象中。

鑑於你在這個數據(過濾6列或多列)未來方向的數量,我不知道你會如何更能夠優化內存中的信息。我會嘗試的第一件事是將它存儲在Application對象的列表中,並使用LINQ到對象來查詢它。或者,如果有一個字段比其他字段使用得更多,或者嘗試使用字典而不是列表。如果性能仍然是一個問題,請嘗試使用將其存儲在DataSet中並設置索引(但當然,這樣可以減少代碼的簡單性和可維護性)。

0

我不認爲有一個適合您所有問題的答案。根據數據大小和使用模式,答案會有所不同。不僅如此,答案可能會隨着時間而改變。

這就是爲什麼在我的開發中,我構建了一些中間層,它允許我通過更改配置(無代碼更改)來更改緩存的方式。每次我們分析各種統計數據(緩存命中率等)並決定是否要更改緩存行爲。

BTW還有第三層 - 你可以把你的靜態數據到瀏覽器,並將它緩存有太多

+0

我絕對打算有一箇中間層,以便我們可以切換機制。我真的只是試圖在這一點上探討這個問題。真的有太多的數據要發送到客戶端,在那裏進行過濾。 – pkaeding 2010-02-12 22:31:15

0

你可以將它硬連接到程序(只要你堅持幹)?改變它只需要重建。

+0

唯一的問題是數據需要能夠在系統外進行更改(更改時)。所以規範數據需要在數據庫中,並且應用程序可以在啓動期間或者在夜間計時器中讀取它,或者其他東西。 – pkaeding 2010-02-12 23:43:46

+0

@pkaeding:這是一個很好的理由。 – 2010-02-13 01:40:39

相關問題