2012-02-21 20 views
0

我有一個大的包含數據庫的話和他們的變形形式,如:「壓縮」雙字(不定式和拐點)

BASIC_FORM ##### INFLECED_FORM 

talk ----- talk 
talk ----- talking 
talk ----- talked 
talk ----- talks 
paragraph ----- paragraph 
paragraph ----- paragraphs 
... 

這個數據庫需要大量的課程的磁盤空間,如只要它有一百萬或更多的條目。

什麼是「壓縮」這組數據的最佳方法,即減少所需的磁盤空間量,同時不會丟失任何信息?

我的第一個想法是創建一個額外的列,其中包含可以從基本表單開始複製的字符數。然後你只需要保存詞尾變化的形式是不同的,例如部分:

BASIC_FORM ##### NUM_EQUAL ##### INFLECED_FORM 

talk ----- 4 ----- 
talk ----- 4 ----- ing 
talk ----- 4 ----- ed 
talk ----- 4 ----- s 
try ----- 3 ----- 
try ----- 2 ----- ied 
paragraph ----- 9 ----- 
paragraph ----- 9 ----- s 
... 

這應該節省磁盤空間量爲「NUM_EQUAL」在MySQL中可保存爲TINYINT(例如),所以它需要只有1個字節,並且在字符串「INFLECTED_FORM」中通常會保存超過1個字符(即多於1個字節)。

您是否有其他建議來節省磁盤空間?

回答

1

您應該使模型標準化。這意味着,爲basic_form創建一個單獨的表。我不確定您將節省多少空間,因爲這將取決於數據(您擁有的字詞越長,您擁有的詞彙越多,您將節省的空間也越多)。然而,假設你只有一個單詞和一個反義詞(我知道情況並非如此,但讓我們把它放到那個極端),然後有兩個表格會增加所需的存儲空間。

現在,在使用之前的重構(這也可以爲您節省一些頭痛,因爲規範化總是這樣做!),您也可以應用您的系統來減少存儲輸入的大小。

1

爲什麼不創建兩個表所示:

BasicForm 
    id 
    word 

InflectedForm 
    id 
    basicFormId 
    inflectedWord 

這樣,要刪除所有具有重複了每個拐點這個詞的基本版本創建的重複。

+0

是的。 http://en.wikipedia.org/wiki/Database_normalization – 2012-02-21 23:09:04

+0

如果他選擇堅持數據庫。 – 2012-02-21 23:11:31

1

在構建模型文件時,爲了創建對象名稱,有幾個框架需要變換功能,並且它們工作得很好。我使用的是CakePHP's Inflector類。

雲一樣的東西:

public static function inflect($rootString, $howMany) 
{ 
    return ((int) $howMany > 1) ? Cake_Inflector::pluralize($rootString) : Cake_Inflector::singularize($rootString); 
} 

機會是,如果有一些東西,你需要活用普通的,它不是建立在你可以通過擴展類添加它,但希望它表明你有什麼可能,而不是增加一個數據庫。

+0

你最終解決了這個問題嗎? – 2012-03-08 23:40:04

+0

我的問題可能太複雜了,也爲此創建一個類。我有一個有11,000行的程序,可以從變化的形式推導出基本形式。但總的來說:一個好主意! – caw 2012-04-15 13:28:44