Как лучше кэшировать поля ссылочного документа в Mongoid? - PullRequest
0 голосов
/ 21 декабря 2011

Каков лучший способ кэширования полей ссылочного документа в Mongoid?

В настоящее время я использую для этого дополнительные поля:

class Trip
  include Mongoid::Document

  belongs_to :driver

  field :driver_phone
  field :driver_name

end

class Driver
  include Mongoid::Document

  field :name
  field :phone
end

Может быть, было бы более понятно хранить кэшкак вложенный объект, так в монго он будет храниться как:

{ driver_cache: { name: "john", phone: 12345 } }

Я думал о встроенном документе с отношением 1-1?Это правильный выбор?

Ответы [ 5 ]

3 голосов
/ 21 декабря 2011

Автор Mongoid (Дурран Джордан) предложил следующий вариант

Этот драгоценный камень выглядит удобным для вещей такого типа:

https://github.com/logandk/mongoid_denormalize

1 голос
/ 30 июля 2012

Отличный вопрос.Я создал и поддерживаю mongoid_alize , драгоценный камень для денормализации отношений между монгоидами.И поэтому я боролся с этим вопросом.

Начиная с версии 0.3.1, alize теперь хранит данные для денормализованного «один-к-одному» в Hash, очень похоже на ваш второй пример выше с w / driver_cache.Предыдущие версии, однако, хранили данные в отдельных полях (ваш первый пример).

Изменение было вызвано многими факторами, но в основном для обеспечения согласованности обработки один-к-одному и один-ко-многим (alize может денормализовать один-к-одному, один-ко-многим и многие-ко-многим).«один ко многим» всегда обрабатывался путем хранения данных в массиве хэшей.Хранение данных «один-к-одному» как простого хэша становится гораздо более симметричным.

Это также решило несколько других проблем.Вы можете найти более подробное объяснение здесь - https://github.com/dzello/mongoid_alize#release-030

Надеюсь, это поможет!

0 голосов
/ 21 декабря 2011

Алексей

Я бы рекомендовал подумать о том, как будут использоваться данные. Если вы всегда используете информацию о драйвере в контексте объекта отключения, то встраивание, вероятно, является правильным выбором.

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

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

1009 * Тайлер *

0 голосов
/ 21 декабря 2011

Альтернативное хеш-хранилище ваших кэшируемых данных:

field :driver_cache, type: Hash

(Имейте в виду, что внутренне ключи будут преобразованы в строки.)

0 голосов
/ 21 декабря 2011

В любом случае, ты в порядке.

Первый подход кажется немного лучше, поскольку он явно указывает, какие данные вы кэшируете.Кроме того, это (вероятно) требует меньше работы от Mongoid: -)

...