Ответ
Да, несколько раз. Чаще всего это было связано с ростом нагрузки и изменением бизнес-требований.
Например, в одном из проектов изначально использовалась денормализованная схема, где данные заказов хранились в JSON-поле таблицы пользователей. При увеличении объема данных и необходимости сложных аналитических запросов это стало узким местом. Мы провели нормализацию до третьей нормальной формы (3NF), выделив заказы в отдельную таблицу и настроив индексы.
Пример рефакторинга:
-- Было: плохая нормализация
CREATE TABLE users (
id INT,
name VARCHAR(100),
order_details TEXT -- JSON-массив заказов
);
-- Стало: нормализованная схема
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(100)
);
CREATE TABLE orders (
id INT PRIMARY KEY,
user_id INT,
details TEXT,
created_at TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id)
);
CREATE INDEX idx_orders_user_id ON orders(user_id);
CREATE INDEX idx_orders_created_at ON orders(created_at);
Основные причины перепроектирования в моем опыте:
- Производительность: медленные запросы из-за отсутствия индексов или неоптимальной схемы.
- Новые требования: бизнесу потребовались отчеты, которые было невозможно построить на старой структуре.
- Масштабирование: подготовка к шардингу или репликации.
- Целостность данных: внедрение FOREIGN KEY и CHECK-ограничений, которых изначально не было.
Перед внедрением в production мы всегда тестировали изменения на staging-окружении с копией реальных данных, проводили нагрузочное тестирование и планировали миграцию с минимальным временем простоя.