“压缩”单词对(不定式和变形)

时间:2012-02-21 22:56:24

标签: database string text compression

我有一个包含单词及其变形形式的大型数据库,例如:

BASIC_FORM ##### INFLECED_FORM

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

当数据库有100万条或更多时,这个数据库需要大量的磁盘空间。

“压缩”该组数据的最佳方法是什么,即在没有信息丢失的情况下减少所需的磁盘空间量?

我的第一个想法是创建一个额外的列,其中包含可以从基本表单的开头复制的字符数。然后你只需要保存不同的变形形式的部分,例如:

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个字节)。

您是否有其他建议可以节省磁盘空间?

3 个答案:

答案 0 :(得分:1)

为什么不创建两个表,如:

BasicForm
  id
  word

InflectedForm
  id
  basicFormId
  inflectedWord

通过这种方式,您将删除通过为每个变形重复该单词的基本版本而创建的所有复制。

答案 1 :(得分:1)

有几个框架需要变形功能,以便在构建模型文件时创建对象名称,并且它们工作得很好。我使用的是CakePHP's Inflector类。

类似于:

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

如果有一些与众不同的东西,你需要变形,并且它不是内置的你可以通过扩展类来添加它,但希望它能告诉你什么是可能的,而不是填充数据库。

答案 2 :(得分:1)

您应该规范化模型。这意味着,为basic_form创建一个单独的表。我不确定你会节省多少空间,因为这取决于数据(你拥有的单词越久,你拥有的变形越多,你将节省的空间越多)。但是,假设你每个人只有一个单词和一个变形单词(我知道情况并非如此,但让我们把它带到那个极端),然后有两个表会增加所需的存储空间。

现在,在使用上一个重构之后(这也会为你节省一些麻烦,因为规范化总是这样做!)你也可以应用你的系统来减少存储输入所需的大小。