Статьи

Agile Базы данных

Любой проект, следуя методологии Agile, обычно выпускается в производство не менее 15–20 раз в год. Даже если только половина из этих выпусков включает изменения в базе данных, это 10 изменений в производственных базах данных, поэтому вам нужен хороший бережливый процесс, чтобы убедиться, что вы получаете хороший бумажный след, но в то же время вам не нужно что-то, что замедлит вас просто излишне вниз. Итак, несколько советов на этот счет:

Совет 1: представьте таблицу журнала БД

Используйте таблицу журнала БД для записи каждого запускаемого скрипта, кто его запускал, когда он был запущен, с каким билетом он был связан и т. Д. Вот пример DDL для такой таблицы для PostGres:

1
2
create sequence db_log_id_seq;
create table db_log (id int8 not null DEFAULT nextval('db_log_id_seq'), created timestamp not null,  db_owner varchar(255), db_user varchar(255), project_version varchar(255), script_link varchar(255), jira varchar(255));

WRT столбцы таблицы:

  • id — первичный ключ для таблицы.
  • метка времени — время запуска скрипта. Это полезно Поверь мне.
  • db_owner — пользователь, который выполнил скрипт.
  • db_user — пользователь, который написал скрипт
  • project_version_number — версия вашего приложения / проекта, в котором был сгенерирован скрипт.
  • scrip_link — URL-ссылка на версию скрипта, контролируемую источником
  • jira — URL-адрес заявки, связанной со сценарием.

Совет 2: Все сценарии должны быть транзакционными

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

01
02
03
04
05
06
07
08
09
10
11
12
13
BEGIN;
ALTER TABLE security.platform_session DROP COLUMN IF EXISTS ttl;
INSERT INTO db_log (
       db_owner, db_user, project_version, script_link, jira, created)
VALUES (
       current_user,
       'alexstaveley',
       '1.1.4',
       'CP-643',
       current_timestamp
);
COMMIT;

Совет 3: сценарии должны быть идемпотентными

Попробуйте сделать сценарии идемпотентными. Если в команде 10 разработчиков, то время от времени кто-то дважды запускает скрипт случайно. Ваш db_log скажет вам об этом, но постарайтесь, чтобы в случае несчастных случаев не было серьезных повреждений. Это означает, что вы получите простой
отказоустойчивый, а не какой-то новичок, волнующийся. В приведенном выше сценарии, если он выполняется дважды, ответ будет точно таким же.

Совет 4: Source Control вашей схемы

Исходный контроль мастер DDL для всего проекта. Это обновляется каждый раз, когда меняется схема. Это означает, что у вас есть сценарии обновления
и полный мастер-скрипт, содержащий DDL для всего проекта. Главный скрипт запускается в начале каждого CI, что означает, что:

  • Ваш CI всегда начинается с чистой базы данных
  • Если разработчик забудет обновить мастер-скрипт, CI потерпит неудачу, и ваша команда быстро узнает, что мастер-скрипт необходимо обновить.
  • Когда у вас есть мастер-скрипт, он дает вам два явных преимущества:
    • Новые разработчики очень быстро начинают работать с чистой базой данных
    • Становится очень легко создавать новые среды. Просто запустите мастер-скрипт!

Совет 5: будьте дружелюбны к Dev

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

Совет 6: обновить и вернуть

Для каждого сценария обновления напишите соответствующий сценарий возврата. Что-то неожиданное случается в производстве, ты должен быть в состоянии перевернуть грузовик обратно!

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
BEGIN;
 
ALTER TABLE security.platform_session ADD COLUMN hard_ttl INT4;
UPDATE security.platform_session  SET hard_ttl = -1 WHERE hard_ttl IS NULL;
ALTER TABLE security.platform_session ALTER COLUMN hard_ttl SET NOT NULL;
 
ALTER TABLE security.platform_session ADD COLUMN ttl INT4;
UPDATE security.platform_session  SET ttl = -1 WHERE ttl IS NULL;
ALTER TABLE security.platform_session ALTER COLUMN ttl SET NOT NULL;
 
 
INSERT INTO db_log (
       db_owner, db_user, platform_version, script_link, jira, created)
       values (
       current_user,
       'alexstaveley',
       '1.1.4',
       'CP-463',
       current_timestamp
    );
 
COMMIT;

До следующего раза береги себя.

Ссылка: Гибкие базы данных от нашего партнера JCG Алекса Стейвли в блоге Tech Blog в Дублине .