Могу ли я изменить модель со встроенной на ссылочную без потери данных? - PullRequest
1 голос
/ 01 февраля 2011

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

Я использую Mongoid, поэтому я решил, что могу просто изменитьОт 1003 * до referenced_in.Прежде чем начать, я решил спросить людей, которые знают лучше меня.Как я могу перенести внедренные данные уже в базе данных в документ для связанной модели.

class Building

  embeds_many :landlords

..
end

class Landlord 
  embedded_in :building
...
end

Ответы [ 2 ]

0 голосов
/ 18 июня 2011

Просто изменить модель, как у вас выше, не будет работать, старые данные будут по-прежнему в другом строке в БД.

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

Я отделил слой данных от логики, поэтому он позволил мне добавить несколько препроцессоров и внедрить код для выполнения следующих действий.

Допустим, мы начинаем со старой модели данных, а затем выпускаем новый кодэто делает следующее: при каждом доступе к документу вам нужно будет проверить, существует ли встроенное свойство, если оно существует, создать новую запись, связанную как ссылку, сохранить в базе данных и удалить внедренное свойство из документов.Как только это было сделано в течение нескольких дней, многие мои данные были перенесены, а затем мне просто нужно было запустить аналогичный скрипт для всего, что не было затронуто, сделало работу по переносу данных намного проще и проще, а у меня не былозапускать долго выполняющиеся сценарии или отключать систему для выполнения преобразования.

У вас может не быть этого требования, поэтому выберите соответственно.

0 голосов
/ 02 февраля 2011

Краткий ответ - Поэтапно.

  1. Создайте копию Landlord, назовите ее Landlord2.
  2. Сделать это ссылкой в ​​Building.
  3. Скопируйте все данные от арендодателя к арендодателю2.
  4. Удалить арендодателя.
  5. Переименуйте Лендлорда2 в Лендлорда.

Пользователи не должны иметь возможность CRUD Landlord во время шагов 3-5 (в идеале). Вы все еще можете обойтись только с блокировкой CRUD на 4-5. Просто убедитесь, что вы делаете все обновления, которые произошли во время копирования, прежде чем удалять Арендодателей.

...