Советы по реорганизации устаревшей схемы базы данных

Будучи застрявшим с устаревшей схемой базы данных, которая больше не отражает вашу модель данных, каждый кошмар разработчика. Тем не менее, со всеми разговорами о рефакторинге кода для ремонтопригодности я не слышал много рефакторинга устаревших схем баз данных.

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


Мой пример:

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

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

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

Ответы

Ответ 2

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

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

Ответ 3

Это очень трудная работа; Пара быстрых опций после рефакторинга базы данных:

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

Ответ 4

Хранимые процедуры и представления - ваш друг здесь. Даже если система не использует их, измените их, чтобы использовать их, а затем реорганизуйте базу данных внизу.

Теперь ваши квитанции и отгрузки становятся видами.

Остерегайтесь, квитанции и отгрузки на самом деле являются двумя совершенно разными животными в большинстве систем, с которыми я работал. Квитанции привязаны к поставщикам, а поставки привязаны к клиентам (или местам клиента/судна). На уровне инвентаря они часто представляются одинаковыми.

Ответ 5

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

Надеемся, что ни у кого из них нет запросов "select *". Если это так, используйте "sp_help tablename", чтобы получить полный список столбцов, скопируйте их и замените каждый * полным списком столбцов, чтобы убедиться, что вы не разорвали код клиента.

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

Ответ 6

Прежде всего, нужно создать схему таблицы. Я уже сделал это для базы данных Legacy с использованием Enterprise Architect. Вы можете выбрать БД, и он создаст вам все таблицы/поля. Затем вам нужно разделить все по категориям. Например, все ваши продукты и продукты для отправки вместе, материал клиента в другой категории. После того, как все будет понятно, вы сможете создать поле для рефакторинга, создав новую таблицу, новое расписание и новые поля. Конечно, это потребует много изменений, если все будут доступны без хранимой процедуры.

Ответ 7

Я не думаю, что его очевидно, что идентификатор таблицы транзакций должен быть внешним ключом для ReceiptInfo или ShipmentInfo. Подумайте наоборот. В объектно-ориентированной модели у вас должна быть таблица транзакций, а ReceiptInfo или ShipmentInfo должны иметь внешний ключ в таблице транзакций. Если вам повезет, в коде будет только 1 или 2 пункта, где будут сделаны новые записи в ReceiptInfo или ShipmentInfo. Там вы должны добавить код, в который вы добавляете запись в таблицу Transaction, и после этого создайте запись в ReceiptInfo или ShipmentInfo с внешним ключом для транзакции.

Ответ 8

Иногда вы можете создавать новые таблицы, которые имеют лучшие структуры, а затем создавать представления с именами ваших старых таблиц, но основываются на данных в новых таблицах. Таким образом, код не прерывается, пока вы переходите к лучшей структуре. Будьте осторожны с thsi, хотя иногда вы переходите из нереляционной таблицы в реляционную структуру, где у вас есть несколько записей, в то время как код будет ожидать только один. Это особенно верно, если у вас есть разработчики, которые используют подзапросы.

Затем, когда каждая вещь будет изменена, она будет отойти от представлений к реальной таблице. В конце концов вы можете отказаться от просмотров. Это по крайней мере позволяет вам работать постепенно, чтобы все работало, когда вы перемещаете материал, но начинаете исправлять вещи, чтобы использовать лучший дизайн.