TL; DR - лучший способ миграции большого количества данных между одной очень плохо структурированной базой данных (с большим количеством повторений столбцов, без взаимосвязи и дублирующихся данных), с другой высокоорганизованной и реляционной структурой? - Извините за долгое чтение!
Недавно я занялся очень сложной работой. Он переписывает всю сетевую ИТ-платформу компании. Боюсь, я не могу дать слишком много деталей, потому что мы не можем допустить, чтобы старый разработчик знал (у него есть метафорическое оружие против главы компании, в котором он единственный, кто знает, как делать критические вещи, такие как создание счетов, и требует все больше и больше денег).
Основная проблема заключается в том, что вся веб-платформа (используемая всем персоналом и всеми клиентами) была закодирована парнем, обладающим навыками меньше, чем любителем. Он состоит из ~ 300 отдельных файлов кода. Там нет библиотеки шаблонов - все это жестко закодировано в каждый файл. Нет логической структуры базы данных - она практически была составлена, когда он шел. Нет никакой безопасности - это шокирует. Во всяком случае, мы будем переписывать всю эту платформу в течение 3-месячного периода.
Однако босс говорит, что утром он идет вживую, данные о клиентах не могут быть потеряны нигде. Содержимое всей базы данных необходимо скопировать напрямую. Структура базы данных в настоящее время настолько плоха, что с ней практически невозможно работать, но на этой неделе мы будем (пытаемся!) Написать некоторые скрипты, чтобы перенести ее на нашу новую, сильно реляционную структуру, которая намного логичнее. Вопрос в том, что лучший способ сделать это?
Одним из примеров является адрес. В старой базе данных адреса используются примерно в 12 таблицах (из 44 всего...). В нашем случае у нас есть одна таблица addresses
, которая будет перекрестно ссылаться на другие таблицы (например, address_id
), чтобы сохранить чистоту. Основная проблема заключается в том, что примерно в половине его таблиц адреса хранятся как line1
, line2
, town
, city
и т.д., Что хорошо, но в другой половине он просто имеет один address
, в котором хранится вся вещь!
Второй пример - даты. В некоторых таблицах у него есть секунды - с тех пор - даты Epoch, в других датах MySQL NOW()
, а в других он буквально хранит его в 6 столбцах в строке - year
, month
, day
, hour
, minute
, second
- ouch...
-
Какой хороший способ сделать это? Должны ли мы смотреть на наши таблицы и работать там, где нам нужно вытащить данные из наших, или же мы должны обратить вспять это и посмотреть на его таблицы и выяснить, куда его данные должны войти в нашу?
-
С точки зрения программирования, как мы должны справиться с этим?. Для большого количества данных требуется динамическое форматирование (например, даты), поэтому мы думали о том, чтобы собирать данные по одной строке за раз, форматируя их правильно, затем повторно вставив его в нужные места в наших скриптах.
-
Скорость и эффективность запросов для нас не проблема,, так как нам нужно будет запускать это только один раз (после тестирования) на наших локальных машинах. Его база данных в настоящее время составляет ~ 800 МБ, когда SQL сбрасывается, но опять-таки много из этого - его бесполезные тестовые данные или просто совершенно ненужные.
Любые идеи о наилучшем способе борьбы с этим? Для справки наша система будет переписана на PHP, поэтому любые рекомендации на основе PHP были бы хороши. База данных в настоящее время (и по-прежнему будет) в MySQL.