[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"glossary-database-migration::ru":3,"gloss-cluster-database-migration::ru":19,"gloss-next-database-migration::ru":9},{"slug":4,"category":5,"name":6,"definition":7,"meta_desc":8,"faq":9,"schema_markup":9,"related":10},"database-migration","data-infra","Миграция базы данных","Миграция базы данных — это единый, находящийся под версионным контролем файл, описывающий инкрементальное изменение схемы базы данных — создание таблицы, добавление столбца, добавление индекса, — предназначенный для применения в фиксированном порядке во всех окружениях (ноутбук разработчика, staging, продакшен), чтобы схема оставалась идентичной и воспроизводимой везде, вместо того чтобы кто-то вручную выполнял команды `ALTER TABLE`, надеясь, что все окружения останутся синхронизированными. Почему это важно для разработчиков AI\u002FSaaS-продуктов: миграции — это механизм, с помощью которого схема безопасно эволюционирует вместе с растущим продуктом: добавление колонки `embedding vector(1536)` для новой RAG-функции, добавление колонки `tenant_id` для обеспечения изоляции мультиарендности (multi-tenancy) или добавление индекса для исправления медленного запроса — всё это миграции, зафиксированные в системе контроля версий вместе с кодом приложения, который от них зависит, так что `git checkout` любого исторического коммита соответствует схеме, которую инструмент миграций может воспроизвести в точности. Как это работает: инструменты миграций (встроенные миграции Laravel, Prisma Migrate, Alembic для Python, миграции Rails) отслеживают, какие миграции уже были выполнены (обычно в специальной таблице `migrations` в самой базе данных), и применяют только новые по порядку при запуске команды `migrate`. Миграции по возможности пишутся обратимыми (шаг `up` и шаг `down`), чтобы неудачный деплой можно было аккуратно откатить. По-настоящему сложная часть в продакшен-системах — не написание миграций, а их безопасное выполнение на живой высоконагруженной базе данных без простоя: добавление колонки обычно безопасно и быстро, но добавление ограничения `NOT NULL` к существующей большой таблице или построение индекса могут заблокировать таблицу и остановить записи на всё время выполнения, если не сделать это аккуратно (например, `CREATE INDEX CONCURRENTLY` в Postgres строит индекс без удержания блокировки на всю таблицу ценой более долгого выполнения и отсутствия транзакционности). Практический пример: команда, добавляющая векторный поиск в свой SaaS, пишет миграцию `AddEmbeddingToDocuments`, которая выполняет `ALTER TABLE documents ADD COLUMN embedding vector(1536);`, а затем `CREATE INDEX CONCURRENTLY ON documents USING hnsw (embedding vector_cosine_ops);` — параллельное (concurrent) построение индекса позволяет продакшен-базе данных продолжать обслуживать живые чтения и записи на протяжении многоминутного построения индекса на таблице с 5 миллионами строк, вместо того чтобы блокирующая, непараллельная версия останавливала записи в таблицу до завершения. Эта миграция проходит код-ревью перед слиянием именно из-за соображений безопасности продакшена — ревьюер, знакомый с трафиком команды, замечает, что наивный `CREATE INDEX` (без `CONCURRENTLY`) сделал бы таблицу documents недоступной для записи в рабочие часы — ошибка, незаметная в локальном окружении разработки с парой сотен строк и становящаяся очевидной только в продакшен-масштабе.","Миграция базы данных — это версионированное, инкрементальное изменение схемы БД, применяемое по порядку во всех окружениях для их синхронизации.",null,[11,14,16],{"slug":12,"name":13},"index-database","Индекс (база данных)",{"slug":15,"name":15},"pgvector",{"slug":17,"name":18},"postgresql","PostgreSQL",[20,24,27,30,33,37,40,43,46,49,53,56],{"slug":21,"category":5,"name":22,"updated_at":23},"acid","ACID","2026-08-24T02:46:37+00:00",{"slug":25,"category":5,"name":26,"updated_at":23},"ann-search","ANN-поиск (приближённый поиск ближайших соседей)",{"slug":28,"category":5,"name":29,"updated_at":23},"backpressure","Обратное давление (backpressure)",{"slug":31,"category":5,"name":32,"updated_at":23},"batch-processing","Пакетная обработка (Batch Processing)",{"slug":34,"category":5,"name":35,"updated_at":36},"bm25","BM25","2026-08-24T02:46:38+00:00",{"slug":38,"category":5,"name":39,"updated_at":23},"cache","Кэш (Cache)",{"slug":41,"category":5,"name":42,"updated_at":23},"cap-theorem","Теорема CAP (CAP theorem)",{"slug":44,"category":5,"name":45,"updated_at":23},"change-data-capture","Захват изменений данных (CDC)",{"slug":47,"category":5,"name":48,"updated_at":23},"chroma","Chroma",{"slug":50,"category":5,"name":51,"updated_at":52},"chunk-overlap","Перекрытие фрагментов","2026-08-24T03:30:02+00:00",{"slug":54,"category":5,"name":55,"updated_at":23},"columnar-storage","Колоночное хранение",{"slug":57,"category":5,"name":58,"updated_at":23},"connection-pooling","Пулинг соединений (Connection Pooling)"]