2009-09-14 43 views
3

我想設計一個通過非常慢的網絡鏈接訪問的數據庫。幸運的是,數據庫本身非常靜態。所以我要用積極的緩存結果。有時,在客戶端運行時,其他插入和更新可能發生在表上,所以我想設計一個低帶寬系統,客戶端知道什麼時候更新了某些東西,以避免檢查遠程數據庫。如何設計緩存友好的數據庫表?

我的想法是創建一個包含兩列的特殊表格,一個是表格的名稱,另一個是版本號。該表不會被應用程序查詢直接修改。它將用存儲過程進行更新。每當任何表被修改時,存儲過程應該增加這個特殊表的數量。

客戶端然後可以將查詢的結果與表的版本號一起存儲在本地數據庫(如sqlite)中。然後,下一次在特殊表上運行選擇並檢查表是否已更改。

聽起來如何?是否有其他策略來最小化冗餘數據庫帶寬並積極緩存數據庫?事情不僅是跨平臺的,而且編程語言中的不同客戶端將訪問它(C,C++,Obj-C,Python等),所以我試圖找到最簡單的東西在所有情況下工作。

理想情況下,我想設計表爲增量(刪除是實際的插入),所以我可以只查詢表的最高ID並與本地進行比較。但是,我不知道在哪裏尋找這方面的例子。閱讀CouchDB's technical page讓我的頭部爆炸。

+0

我認爲,如果你配料很多更新的時間戳只會工作。或者,當你爲了時間戳而絆倒時,你可能已經完成了! – Will 2009-09-14 15:23:52

回答

1

如果您希望有很多客戶端訪問此數據庫,並且使用很多不同的語言編寫,那麼您可能希望在客戶端可以連接的數據庫之上編寫一個瘦服務器層。這臺服務器可以處理緩存,也可以通過線路發送它正在發送的數據。那麼你的客戶端可以只發送一條信息,要求從時間X的最新數據,並且服務器可以返回要麼只是需要的數據或消息說

+0

+1好的答案,如果這個服務器模塊有一個共同的語言。但是爲了高效緩存,緩存需要在服務器本身上,所以遠程通信就在數據庫中。壓縮是否發生在該通信上? – KLE 2009-09-14 15:37:45

+0

服務器層將在同一本地網絡的數據庫上運行。然後它會在將數據通過慢速網絡鏈接發送給客戶端之前進行壓縮。服務器模塊可以用任何語言編寫,因爲它會通過一些網絡協議談話的客戶,無論是中級如TCP/IP,或如HTTP或XML-RPC高水平 – 2009-09-14 16:11:26

0

我認爲它可以在第一時間工作。您也可以將表中的數據分組,以便您的頻繁更改的數據與您的近似常數不在同一個表中...

但是數據庫也用於運行復雜查詢,並有許多連接。你會失去所有服務器代碼的可能性,這將是一個沉重的代價!或者你可以實現一個檢查,但它是非常複雜的,而且可能在某種程度上也慢...


難道你會保持你的數據庫的本地副本,與同步是更容易遙遠的一個。你仍然可以在本地使用複雜的查詢。

而數據庫之間的同步可能已經存在於您的數據庫供應商。 至少,這是一個普遍的問題了,所以你可以看看好現有的解決方案:-)


否則,你會做自己的實現同步。

你可以有一個專用的版本表,每個表的最後一個版本號和一列指每個表的每行數據版本。 要同步,你會:

  • 查詢遙遠的版本表,把它比作你的本地版本表,並確定您要查詢的表,其中的每個表興趣版本的範圍。
  • 爲每個表進行查詢,查詢以獲取其版本號在適當範圍內的所有行,並插入或更新本地數據庫中的行。
0

從你的描述「因爲時間X沒有變化」,這聽起來不太可能該數據庫將從3個或4個以上的站點訪問。這是一種情況數據庫複製(even MySQL supports this)是專爲。

你可以在每個站點的數據庫需要從訪問的複製奴隸。並編寫客戶端軟件以簡單查詢本地副本。相信我,當你不必重新實現像複製這樣的低級功能時,數據庫更容易處理。