Миграция данных
Задача
Перенос данных из nsuts 1.2.8 в nsuts 1.3.0 для
- сохранения задач, тестов, условий из старых олимпиад и предоставления возможности их «дорешивания»
- сохранения результатов прошедших олимпиад (рейтинги, отчеты)
Варианты
- Используя ORM сгенерировать объектные представления из старой схемы базы данных и из новой. Затем написать методы для получения каждой сущности новой базы данных
- Использовать SQL-скрипты для извлечения данных из старой базы данных.
Решение
1)
Устранение неконсистентных записей в старой системе
2) Скрипт migrator, экспортирующий исходные данные, преобразующий и импортирующий их в целевое местоположение.
- Копирование статических данных. Задаются при создании базы данных, это таблицы, содержащие города (cities), университеты (universities), компиляторы (langs). Эти данные не изменились при переходе на новую систему.
- Копирование данных, обязательных для переноса (для построения рейтингов и отчетов). Например, это таблицы с описание туров (tour), посылок (submits), временных сдвигов (timeshift).
При этом:
- Связанные данные должны быть перенесены вместе (Либо сохраняются старые идентификаторы, либо переименовываются)
- Создание абстрактных команд. Такие пользователи не имеют возможности зайти в систему, но при этом отображаются в результатах прошедших олимпиад. В таблице team добавлена запись old_userid
- Копирование данных, характеризующих участие конкретной команды в олимпиаде, но не влияющее на построение общих отчетов и рейтингов. Например, это таблицы, содержащие уведомления, полученные пользователем (notifications), вопросы, заданные во время тура (qna), ссылаются на team.id.
PS представление многих данных изменилось, поэтому используются конверторы. Примеры:
1) в старой системе для форматирования новостей использовался язык разметки bbcode. В новой системе, с введением WYSIWYG-редактора, основанного на Java Script и встраиваемого в веб-страницу, потребовалось преобразовать содержание новостей в HTML-код.
2) экранирование кавычек
3) для временного сдвига указывается начало и конец, а не интервал как раньше
PPS Тексты, отправленные на печать (print), журнал событий (log) относятся к проошедшим олимпиадам и вряд ли могут быть полезны в будущем. Такие данные игнорируются ри переносе.
PPPS Текущая структура базы данных лежит в /branches/nsuts-1.3.0.0/sql/nsuts_db.sql
3) В nsuts 1.3.0 реализована функциональность подключения старого аккаунта:
при вводе логина и пароля от старой системы происходит привязка записи из таблицы user к импортированной записи team (поиск по old_userid)
Возможные проблемы при миграции
- При добавлении команды, ошибка что такой id уже cуществует. Т.к в запросе делается два JOIN, то есть вероятность что существует несколько одинаковых строк в olympiads или privs.
- В базе lang.id должен быть char(n), где n >= 10. В одной из версии структуры БД char(8). Из-за этого проблема с пропажей решений на mingw4.6.1