我有一个包含单词及其变形形式的大型数据库,例如:
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个字节)。
您是否有其他建议可以节省磁盘空间?
答案 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创建一个单独的表。我不确定你会节省多少空间,因为这取决于数据(你拥有的单词越久,你拥有的变形越多,你将节省的空间越多)。但是,假设你每个人只有一个单词和一个变形单词(我知道情况并非如此,但让我们把它带到那个极端),然后有两个表会增加所需的存储空间。
现在,在使用上一个重构之后(这也会为你节省一些麻烦,因为规范化总是这样做!)你也可以应用你的系统来减少存储输入所需的大小。