2014-01-25 89 views
1

我打算在SQLite db表格中轉換一個text文件;我很關心這些問題,因爲不惜一切代價爲它編寫代碼:SQLite vs文本文件數據庫 - 大小比較?

  • 這兩個文本文件或其對應的sqlite數據庫都是相同的大小?
  • SQLite會佔用比文本文件更少的空間嗎?
  • 或者文本文件db是空間最小的那個?
+0

如果你選擇去使用SQLite那麼線程[「調整爲最佳的壓縮SQLite數據庫」(http://comments.gmane.org/gmane.comp.db.sqlite.general/72648)可感興趣。 – iljau

+0

是的,有點幫助。謝謝。 – Master

回答

1

我期望文本文件變得更小,因爲它沒有任何開銷:數據庫給你的所有東西都有空間成本。

聽起來好像空間是唯一對你很重要的東西,並且你希望經常改變文本文件的內容(你稱之爲'文本文件db')。請注意,沒有「文本文件數據庫」這樣的東西。與適當的數據庫(如SQLite)相比,讀取和寫入數據將非常緩慢。添加不同的記錄類型(數據庫中的表格)會使您的想法複雜化,我不想嘗試維護文本文件中記錄類型之間的任何類型的引用鏈接。

希望幫助 -

3

"Hardware is cheap" - 我強烈建議不要擔心大小的差異,這將可能是微不足道的,無論如何,而是選擇哪種解決方案最適合你的需要休息。對於簡單的項目,文本文件可以很好地工作,但是數據庫有更多的功能可以幫助您更高效,更有效地組織,備份和查詢數據。

爲了更深入地看看正反兩種方案的利弊,請上網:database vs. flat files

+0

是的,謝謝。我實際上需要獲取DB版本的文本文件,只是爲了優化和高效查詢。 – Master

1

有些事情要記住:

(注意這個答案:文件在這裏內部參考/外部存儲,不SharedPrefs)

SQL:

  • 數據庫具有開銷,它不佔用尺寸
  • 如果數據庫或表損壞,所有數據都會丟失(這取決於您的應用程序有多糟糕。丟失幾千張照片:不好。失去刪除日誌:不是很糟糕)
  • 數據庫可以被壓縮(見this
  • 您可以將數據分成不同的表,如果你有一個ID(或任何方式,您確定行X)的問題,這意味着一個數據庫可以爲每個對象創建多個表,其中對象X與對象Y具有標識衝突。這基本上意味着您可以將所有內容保存在一個文件中,並且仍然避免與名稱衝突。 (更多內容請見答案的底部)

文件:

  • 每一個文件必須定義它自己獨立的文件,該文件佔用空間(文件名)
  • 您無法將所有屬性存儲在一個文件中,而無需設置確定不同類型數據的高級讀取器。如果你不這樣做,並且每個屬性都有一個文件,那麼你將使用很多空間。
  • 讀萬卷書行可以走慢,特別是如果你有幾個(比如100+)非常大的文件

操作系統使用空間爲每個文件,但不包括的內容。實例的文件名稱,佔用空間。但要記住的是,您可以將應用程序的所有數據保存在單個文件中。如果您有一個應用程序,兩種不同類型的對象可能有命名問題,您可以創建一個新的數據庫。


命名衝突

假設你有兩個對象,對象X和Y.

方案1'

對象X存儲兩個變量。文件名是(x和y在這種情況下是座標):

x.txt 
y.txt 

但是在更高版本中,對象Y帶有相同的兩個文件。 所以,你必須指定一個ID爲對象的X和Y:

0-x.txt 
0-y.txt 

每個文件的名稱使用3個字符(7共有包括擴展名)獨自一人。這個設置越複雜越大。參見場景2

但是,在數據庫中保存時,會得到ID爲0的行並找到列X或Y. 您不必擔心文件名。

此外,如果每個對象保存大量文件,則加載或保存每個文件的引用將佔用大量空間。這會影響您的APK文件,並緩慢推動您達到50 MB限制(谷歌播放限制)。

您可以創建通用方法,但是您可以對SQL執行相同的操作並在APK文件中節省空間。但與文本文件相比,SQL確實可以節省一些名稱空間。

不過請注意,如果您保存2-3文件(只取數字)將名字那幾個字節不會不要緊

這是當你開始儲蓄數以百計的文件,長名以避免命名衝突,即SQL在節省空間的時候。如果表格變得太大,可以壓縮它。您可以壓縮文本文件以節省一些空間,但是對於單行文件,節省的內容並不多。

方案2

對象X和Y各有三個孩子。

每個孩子有3個變量保存到文件系統。如果有3個孩子,只有一個對象,它可以挽救像這樣

[id][variable name].txt 

但因爲有3個孩子另一位家長(同一類型,而且它們保存在同一文件)對象的孩子誰最後保存的是保存的那些。前3個被覆蓋。

所以,你必須添加父ID:

[parent ID][child ID][variable name].txt 

而且記住,這些例子都集中在幾個對象。節省的空間量很低,但是當您節省數百個,即使不是數千個文件時,也就是當您開始節省空間時。

現在,如果你創建一個表,你可以存儲你的主要對象(在這種情況下是X和Y)。然後,您可以創建第一個表格,使其能夠識別該對象是父級還是子級,還是可以創建第二個表格。第二個表有兩個ID值;一個標識父母,一個標識孩子。所以,如果你想找到對象436的所有孩子,你只要寫這個查詢:

SELECT * FROM childrentable WHERE `parent_id`='436' 

這會給你所有對象436作爲其父的孩子的所有屬性。

返回時,所有內容都存儲在光標中。

如果你做同樣的一個文件,這條線(其中Saver是文件保存和加載類):

Saver.load("0-436-file_name", context); 

當然的,可以使用一個for循環來請循環播放兒童ID(開始時爲0),但您還必須保存其中有多少兒童:您無法輕鬆獲取文件,因此您必須存儲關於對象數量和對象兒童的值。

這意思是你必須在更多的文件中保存更多的值,以便能夠首先獲取你保存的文件。這是一個很難做到的事情。數據庫可以幫助您不必編寫文件來跟蹤您保存的文件數量。數據庫將在每個查詢中返回[x]個結果。因此,如果對象436沒有子項,則SQL返回0行。但是在文件中,你必須保存0作爲孩子的數量。猜測文件名會導致I/O異常。