Делает ли django с mongodb миграции в прошлое? - PullRequest
15 голосов
/ 31 августа 2010

Поскольку у mongo нет схемы, означает ли это, что нам не придется выполнять миграции при изменении моделей?

Как выглядит процесс миграции с нереляционной БД?

Ответы [ 3 ]

14 голосов
/ 31 августа 2010

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

Давайте посмотрим нанекоторые распространенные действия по миграции:

  • Добавить поле: Mongo делает это очень легко.Просто добавьте поле, и все готово.
  • Удалить поле: Теоретически, вы на самом деле не привязаны к своей схеме, поэтому «удаление» здесь относительное.Если вы удалите «свойство» и больше не будете загружать поле, то на самом деле не имеет значения, находится ли это поле в данных.Поэтому, если вы не заботитесь о «очистке» базы данных, удаление поля не повлияет на базу данных.Если вы делаете заботитесь об очистке БД, вам, в основном, нужно запустить гигантский цикл for для БД.
  • Изменить имя поля: Это такжесложная проблема.Когда вы переименовываете поле «где», вы переименовываете его?Если вы хотите, чтобы БД отображала имя нового поля, вам нужно выполнить гигантский цикл for в БД.Чтобы быть в безопасности, вам, вероятно, придется «добавить» данные, затем нажать код, а затем «сбросить» старое поле.

Некоторые морщины

ОднакоКонцепция имени поля в тандеме с объектом ActiveRecord немного искажена.Объект ActiveRecord эффективно обеспечивает сопоставление свойств объекта с фактическими полями базы данных.

В типичной СУБД «размер» имени поля на самом деле не имеет значения.Однако в Mongo имя поля фактически занимает пространство данных, и это сильно влияет на производительность.

Теперь, если вы используете какую-либо форму «объекта данных», такую ​​как ActiveRecord, зачем вам пытатьсяхранить полные имена полей в данных?БД, вероятно, должна хранить все поля в алфавитном порядке с картой на стороне объекта.Таким образом, документ может иметь 8 полей / свойств, а имена БД будут «a», «b» ... «j», но имена объектов будут читабельными, например, «Имя», «Цена», «Количество».

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

Еще несколько морщин

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

Mongo предварительно выделяет пространство и на самом деле не «возвращает его», если вы не восстановите БД,Поэтому, если вы удалите кучу полей в документах, эти документы по-прежнему занимают то же место на диске.Если документы впоследствии будут перемещены, вы можете освободить место, однако документы будут перемещаться только по мере их увеличения.

Если вы удалите большое поле из большого количества документов, вы захотите сделать ремонт или проверитьновая команда compact.

1 голос
/ 31 августа 2010

Как выглядит процесс миграции с нереляционной БД?

Зависит от того, нужно ли обновить все существующие данные или нет.

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

Что-то вроде переименования полей (тривиально в реляционной БД, потому что вам нужно только обновить каталог, а не трогать какие-либо данные) - это серьезная задача в MongoDB (вам нужно переписать все документы).

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

1 голос
/ 31 августа 2010

Серебряной пули нет. Добавление или удаление полей проще с нереляционной базой данных (только не используйте ненужные поля или новые поля), переименование поля легче с традиционной базой данных (обычно вам придется изменить много данных в случае переименования поля в БД без схемы) миграция данных находится на одном уровне - в зависимости от задачи.

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