|
| 1 | +# ✅ Сервис валидации схемы БД PostgreSQL |
| 2 | + |
| 3 | +## Цели |
| 4 | + |
| 5 | +Минимизация рисков нестабильности работы БД в процессе накатывания миграций БД в производственной среде |
| 6 | +Поддержание заданного уровня качества БД |
| 7 | + |
| 8 | +## Описание работы |
| 9 | + |
| 10 | +Валидатор представляет из себя функцию в БД PostgreSQL. |
| 11 | + |
| 12 | +Запуск: |
| 13 | + |
| 14 | +```sql |
| 15 | +select db_validate_v2() |
| 16 | +``` |
| 17 | + |
| 18 | +В процессе работы функция проверяет текущую БД на наличие проблем. Если проблемы не найдены, функция успешно завершает работу, никаких данных не возвращается. В случае проблем возвращается ошибка (исключение в терминах PL/PgSQL): текст ошибки и рекомендации по исправлению. |
| 19 | + |
| 20 | +Рекомендуется вызвать функцию в одной транзакции до и после накатывания миграции на тестовой БД. Если до применения миграции ошибок нет, а после есть, значит причина в миграции БД. |
| 21 | + |
| 22 | +## Проверки |
| 23 | + |
| 24 | +<table class="relative-table wrapped" style="width: 100.0%;"> |
| 25 | + <colgroup><col /><col /><col style="width: 16.2491%;" /><col style="width: 17.7945%;" /><col style="width: 51.5393%;" /></colgroup> |
| 26 | +<tbody> |
| 27 | +<tr> |
| 28 | + <th class="numberingColumn">No</th> |
| 29 | + <th colspan="1">В какой версии сделано</th> |
| 30 | + <th colspan="1">Код проверки</th> |
| 31 | + <th>Название проверки</th> |
| 32 | + <th>Назначение проверки</th> |
| 33 | +</tr> |
| 34 | +<tr> |
| 35 | + <td class="numberingColumn">1</td> |
| 36 | + <td colspan="1">v1</td> |
| 37 | + <td colspan="1"><code>has_pk_uk</code></td> |
| 38 | + <td> |
| 39 | + <p>Наличие первичного или уникального индекса в таблице</p></td> |
| 40 | + <td> |
| 41 | + <p>Первичный индекс (PK) позволяет</p> |
| 42 | + <ul> |
| 43 | + <li>однозначно идентифицировать запись таблицы БД</li> |
| 44 | + <li>получить очень быстрый доступ к записи</li></ul> |
| 45 | + <p>Уникальный индекс (UK) позволяет исключить дубликаты</p> |
| 46 | + <p>Без PK или UK невозможно сделать логическую репликацию.</p></td> |
| 47 | +</tr> |
| 48 | +<tr> |
| 49 | + <td class="numberingColumn">2</td> |
| 50 | + <td colspan="1">v1</td> |
| 51 | + <td colspan="1"><code>has_not_redundant_index</code></td> |
| 52 | + <td> |
| 53 | + <p>Отсутствие избыточных индексов в таблице</p></td> |
| 54 | + <td> |
| 55 | + <p>Если есть составной индекс на поля col1 и col2 (именно в такой последовательности), то отдельный индекс на поле col1 не нужен, он <span style="letter-spacing: 0.0px;">избыточный. Лишние индексы занимают место на диске и замедляют DML запросы.</span></p></td> |
| 56 | +</tr> |
| 57 | +<tr> |
| 58 | + <td class="numberingColumn">3</td> |
| 59 | + <td colspan="1">v1</td> |
| 60 | + <td colspan="1"><code>has_index_for_fk</code></td> |
| 61 | + <td colspan="1"> |
| 62 | + <p>Наличие индексов для ограничений внешних ключей в таблице</p></td> |
| 63 | + <td colspan="1">Без индексов на огнаничения внешних ключей (FK) могут работать медленно элементарные запросы типа <strong><code>DELETE FROM {table} WHERE id=<id></code></strong> из-за ссылающихся на <code>{table}</code> таблиц по FK без индекса.</td> |
| 64 | +</tr> |
| 65 | +<tr> |
| 66 | + <td class="numberingColumn">4</td> |
| 67 | + <td colspan="1">TODO</td> |
| 68 | + <td colspan="1"><code>has_table_comment</code></td> |
| 69 | + <td colspan="1">Наличие описания для таблицы</td> |
| 70 | + <td colspan="1">Описание помогает лучше понять назначение таблицы. Проверка на наличие букв любого алфавита в <strong><code>COMMENT ON TABLE {table}</code></strong></td> |
| 71 | +</tr> |
| 72 | +<tr> |
| 73 | + <td class="numberingColumn">5</td> |
| 74 | + <td colspan="1">TODO</td> |
| 75 | + <td colspan="1"><code>has_column_comment</code></td> |
| 76 | + <td colspan="1">Наличие описания для колонки</td> |
| 77 | + <td colspan="1">Описание помогает лучше понять назначение колонки. Проверка на наличие букв любого алфавита в <strong><code>COMMENT ON TABLE {table}.{column}</code></strong></td> |
| 78 | +</tr> |
| 79 | +</tbody> |
| 80 | +</table> |
0 commit comments