«Сжатие» пар слов (инфинитив и перегиб) - PullRequest
0 голосов
/ 22 февраля 2012

У меня есть большая база данных, содержащая слова и их наклоненные формы , например ::

BASIC_FORM ##### INFLECED_FORM

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

Эта база данных, конечно, требует много дискового пространства, как только она содержит 1 миллион записей или более.

Каков наилучший способ «сжать» этот набор данных, то есть уменьшить необходимый объем дискового пространства, пока информация не теряется?

Моя первая идея состояла в том, чтобы создать дополнительный столбец, содержащий количество символов, которые можно скопировать с начала базовой формы. Тогда вам просто нужно сохранить ту часть перекошенной формы, которая отличается, например ::

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» может быть сохранен как TINYINT в MySQL (например), поэтому для него требуется только 1 байт, а в строке «INFLECTED_FORM» вы обычно сохраняете более 1 символа (то есть более чем 1 байт).

Есть ли у вас другие предложения по экономии места на диске?

Ответы [ 3 ]

1 голос
/ 22 февраля 2012

Существует несколько фреймворков, которым необходимы возможности inflect для создания имен объектов при построении файлов моделей, и они работают довольно хорошо. Я использую ClectPHP's Inflector класс.

Идет что-то вроде:

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

Скорее всего, если есть что-то необычное, что вам нужно удивить, и оно не встроено, вы можете добавить это, расширив класс, но, надеюсь, оно покажет вам, что возможно, вместо того, чтобы заполнить базу данных.

1 голос
/ 22 февраля 2012

Вы должны нормализовать модель.Это означает, что создайте отдельную таблицу для basic_form.Я не уверен, сколько места вы сэкономите, потому что таким образом это будет зависеть от данных (чем больше у вас слов и чем больше у вас слов, тем больше места вы сэкономите).Тем не менее, предположим, что у вас есть только одно слово и одно слово с перегибом (я знаю, что это не так, но давайте возьмем это до крайности), тогда наличие двух таблиц увеличит необходимое хранилище.

Теперь,после применения предыдущего рефакторинга (который также избавит вас от некоторых головных болей, как это всегда бывает с нормализацией!), вы также можете применить ВАШУ систему для уменьшения размера, необходимого для хранения вложений.

1 голос
/ 22 февраля 2012

Почему бы не создать две таблицы типа:

BasicForm
  id
  word

InflectedForm
  id
  basicFormId
  inflectedWord

Таким образом, вы удаляете все дубликаты, созданные повторением базовой версии слова для каждого перегиба.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...