2013-04-03 4 views
6

У меня довольно крупная схема базы данных на основе Core Data (~ 20 объектов, более 140 свойств), которая претерпевает большие изменения по мере ее миграции из нашей базы кода 1.x к нашей кодовой базе 2.x.Основные методы миграции данных: движущийся атрибут -> смоделированные отношения

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

Это похоже на пример того, когда вы должны использовать тяжелую миграцию вместо легкого, но я тоже не очень этому рад. Я не знаком с тяжелыми миграциями, у одного из объектов, у которых этот преобразованный массив -> смоделированное преобразование отношений, занимает ~ 90% строк в базе данных, эти базы данных имеют размер более 200 МБ, и я знаю хорошая часть наших клиентов использует iPad 1s. Это в сочетании с повторными предупреждениями в документации Apple и превосходной базой данных Core of Marcus Zarra относительно скорости и использования памяти в результате большой миграции заставляет меня очень осторожно и искать другой способ справиться с этой ситуацией.

Сессия 118 «Учет основных данных» WWDC 2010 118 (slides here) требует входа в систему с 9-го по последний слайд с заголовком «Пост-обработка миграции», о чем я говорю) упоминает способ сортировки работы это - выполнение миграции, а затем использование метаданных хранилища для определения того, была ли выполнена пользовательская пост-обработка, которую вы хотите выполнить. Я думаю, что это может быть способ пойти, но он чувствует себя немного взломанным (из-за отсутствия лучшего слова) для меня. Кроме того, я беспокоюсь о том, чтобы оставить атрибуты, висящие вокруг, которые на практике устарели. ех. если я перейду атрибут barArray объекта foo в отношения между сущностью foo и строкой сущности, а я noil out barArray, barArray все еще существует как атрибут, который можно записать и прочитать. Потенциальным способом решения этой проблемы было бы сигнализировать о том, что эти атрибуты устарели, изменив их имена, чтобы они «устарели» впереди, а также, возможно, переопределили аксессуры для утверждения, если они используются, но с KVO нет гарантированного компиляции которое не позволит людям использовать их, и я не хочу оставлять «код ловушки» вокруг, тем более, что «код ловушки» должен быть примерно до тех пор, пока у меня потенциально есть клиенты, которым все еще нужно перейти с 1.0.

Это превратилось в большую свалку мозга, чем я предполагал, поэтому для ясности мои вопросы:
1) Является ли тяжелая миграция особенно плохим выбором с ограничениями, с которыми я работаю? (бизнес-критическое приложение, отсутствие опыта работы с большими миграциями, базы данных размером более 200 МБ, десятки тысяч строк, клиенты, использующие iPad 1 с iOS 5+)
2) Если это так, описан способ последующей обработки миграции на сессии 118 мой лучший выбор?
3) Если да, то как я могу отменить/в конечном итоге устранить эти «устаревшие» атрибуты, чтобы они больше не загрязняли мою базу кода?

ответ

6

Мое предложение - держаться подальше от интенсивной миграции; полная остановка. Это слишком дорого для iOS и, скорее всего, приведет к неприемлемому опыту пользователя.

В этой ситуации я бы сделал ленивую миграцию. Создайте легкую миграцию, в которой есть связанные объекты.

Затем выполните миграцию, но не перемещайте данные.

Измените аксессуар для этих новых отношений, чтобы он сначала проверял старую трансформируемую, если трансформируемое заполнено, оно вытаскивает данные, копирует их в новое отношение, а затем выводит преобразование.

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

Теперь есть некоторые проблемы с этим дизайном.

Если вы хотите использовать предикаты против этих новых объектов, это будет ... беспорядочно. Вам нужно сделать выбор из двух проходов. i.e. Извлеките предикат, который не ударит по этому новому объекту, а затем выполните извлечение раздела, если они являются памятью, так что трансформируемость переместится.

Смежные вопросы