0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<p>Теги: java, java se, разработка на java, джава, миграция базы данных</p>
1
<p>Теги: java, java se, разработка на java, джава, миграция базы данных</p>
2
<p>Время от времени в практике Java-разработчика появляется необходимость изменить схему базы данных. Например, надо добавить колонку в таблицу или наоборот, удалить. Кажется, что это очень простая задача и говорить тут особенно не о чем, однако<strong>в этом деле есть свои тонкие моменты</strong>.</p>
2
<p>Время от времени в практике Java-разработчика появляется необходимость изменить схему базы данных. Например, надо добавить колонку в таблицу или наоборот, удалить. Кажется, что это очень простая задача и говорить тут особенно не о чем, однако<strong>в этом деле есть свои тонкие моменты</strong>.</p>
3
<p>Данные - это великая ценность, и поэтому требуют особой осторожности в обращении.</p>
3
<p>Данные - это великая ценность, и поэтому требуют особой осторожности в обращении.</p>
4
<h2>Рассмотрим такую ситуацию</h2>
4
<h2>Рассмотрим такую ситуацию</h2>
5
<p>В таблице есть колонка - FIO, в ней хранятся Фамилия, Имя и Отчество - все одной строкой.</p>
5
<p>В таблице есть колонка - FIO, в ней хранятся Фамилия, Имя и Отчество - все одной строкой.</p>
6
<p>В какой-то момент принято решение эту колонку разделить на три независимых: FirstName, SecondName, LastName.</p>
6
<p>В какой-то момент принято решение эту колонку разделить на три независимых: FirstName, SecondName, LastName.</p>
7
<p>Допустим, java-код поменяли и теперь надо изменить таблицу базы данных.</p>
7
<p>Допустим, java-код поменяли и теперь надо изменить таблицу базы данных.</p>
8
<p>Хочется написать такой скрипт: - создать три новые колонки; - выполнить Update, который перенесет данные из старой колонки FIO в новые три; - сделать новые колонки NOT NULL; - удалить старую колонку FIO.</p>
8
<p>Хочется написать такой скрипт: - создать три новые колонки; - выполнить Update, который перенесет данные из старой колонки FIO в новые три; - сделать новые колонки NOT NULL; - удалить старую колонку FIO.</p>
9
<p>Одним скриптом мы выполняем поставленную задачу.</p>
9
<p>Одним скриптом мы выполняем поставленную задачу.</p>
10
<p>Однако есть нюансы: нам обязательно надо одновременно "деплоить" и измененный java-код и этот sql-скрипт модификации таблицы.<strong>Это изменение ломает обратную совместимость между версиями</strong>. Т. е. после применения этого скрипта мы уже не сможем использовать предыдущую версию нашей java-программы. А это может потребоваться, если в новой версии найдется критический баг и придется срочно "откатываться" на предыдущую версию.</p>
10
<p>Однако есть нюансы: нам обязательно надо одновременно "деплоить" и измененный java-код и этот sql-скрипт модификации таблицы.<strong>Это изменение ломает обратную совместимость между версиями</strong>. Т. е. после применения этого скрипта мы уже не сможем использовать предыдущую версию нашей java-программы. А это может потребоваться, если в новой версии найдется критический баг и придется срочно "откатываться" на предыдущую версию.</p>
11
<p>Есть и другой вариант. Можно выполнить миграцию в два этапа.</p>
11
<p>Есть и другой вариант. Можно выполнить миграцию в два этапа.</p>
12
<p>На первом этапе выполняем скрипт, который: - создаст три новые колонки; - выполнит Update, который перенесет данные из старой колонки FIO в новые три.</p>
12
<p>На первом этапе выполняем скрипт, который: - создаст три новые колонки; - выполнит Update, который перенесет данные из старой колонки FIO в новые три.</p>
13
<p>При этом так меняем java-код, чтобы он работал и со старой колонкой, и с новыми, т. е. чтобы делал синхронные изменения.</p>
13
<p>При этом так меняем java-код, чтобы он работал и со старой колонкой, и с новыми, т. е. чтобы делал синхронные изменения.</p>
14
<p>На втором этапе другой скрипт выполняет: - делает новые колонки NOT NULL; - удаляет старую колонку FIO.</p>
14
<p>На втором этапе другой скрипт выполняет: - делает новые колонки NOT NULL; - удаляет старую колонку FIO.</p>
15
<p>Из java-кода уберем функционал для работы с полем FIO.</p>
15
<p>Из java-кода уберем функционал для работы с полем FIO.</p>
16
<h2>Какие выгоды мы извлечем при таком подходе?</h2>
16
<h2>Какие выгоды мы извлечем при таком подходе?</h2>
17
<p>Во-первых, сможем первый скрипт выполнить до "деплоя" Java-кода - часто это очень удобно, т. к. изменение схемы базы данных довольно сложная в организационном плане операция.</p>
17
<p>Во-первых, сможем первый скрипт выполнить до "деплоя" Java-кода - часто это очень удобно, т. к. изменение схемы базы данных довольно сложная в организационном плане операция.</p>
18
<p>Во-вторых, у нас появляется возможность "откатиться" на предыдущую версию.</p>
18
<p>Во-вторых, у нас появляется возможность "откатиться" на предыдущую версию.</p>
19
<p>У этого подхода может быть вариация - "задеплоить" новый java-код, убедиться, что все в порядке и получилось то, что надо и только после этого удалить старую колонку из FIO.</p>
19
<p>У этого подхода может быть вариация - "задеплоить" новый java-код, убедиться, что все в порядке и получилось то, что надо и только после этого удалить старую колонку из FIO.</p>
20
<p>Миграция данных в несколько этапов кажется более трудоемкой, это так. Однако в обмен за бОльшую трудоемкость мы получаем бОльшую гибкость в работе и надежность, а это того стоит.</p>
20
<p>Миграция данных в несколько этапов кажется более трудоемкой, это так. Однако в обмен за бОльшую трудоемкость мы получаем бОльшую гибкость в работе и надежность, а это того стоит.</p>
21
21