Согласованность базы данных (Триггеры и ограничения)
Автоматическое обновление временных меток
sql
-- Функция для автоматического обновления колонки updated_at
CREATE OR REPLACE FUNCTION update_updated_at_column()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at = NOW();
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
-- Применяем ко всем таблицам с updated_at
CREATE TRIGGER update_users_updated_at
BEFORE UPDATE ON core.users
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
CREATE TRIGGER update_user_profiles_updated_at
BEFORE UPDATE ON core.user_profiles
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
CREATE TRIGGER update_partners_updated_at
BEFORE UPDATE ON mlm.partners
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
CREATE TRIGGER update_orders_updated_at
BEFORE UPDATE ON product.orders
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
CREATE TRIGGER update_products_updated_at
BEFORE UPDATE ON product.products
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();Колонки мягкого удаления
sql
-- Добавляем мягкое удаление для требований соответствия/аудита
ALTER TABLE core.users ADD COLUMN deleted_at TIMESTAMP;
ALTER TABLE mlm.partners ADD COLUMN deleted_at TIMESTAMP;
ALTER TABLE mlm.commission_transactions ADD COLUMN deleted_at TIMESTAMP;
ALTER TABLE product.orders ADD COLUMN deleted_at TIMESTAMP;
-- Индексы для запросов с мягким удалением
CREATE INDEX idx_users_deleted ON core.users(deleted_at) WHERE deleted_at IS NULL;
CREATE INDEX idx_partners_deleted ON mlm.partners(deleted_at) WHERE deleted_at IS NULL;Триггеры для денормализованных счетчиков
sql
-- Автоматическое обновление direct_referrals_count при добавлении/удалении партнеров
CREATE OR REPLACE FUNCTION update_partner_referral_count()
RETURNS TRIGGER AS $$
BEGIN
IF TG_OP = 'INSERT' AND NEW.sponsor_id IS NOT NULL THEN
UPDATE mlm.partners
SET direct_referrals_count = direct_referrals_count + 1
WHERE id = NEW.sponsor_id;
ELSIF TG_OP = 'DELETE' AND OLD.sponsor_id IS NOT NULL THEN
UPDATE mlm.partners
SET direct_referrals_count = direct_referrals_count - 1
WHERE id = OLD.sponsor_id;
END IF;
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER trigger_update_referral_count
AFTER INSERT OR DELETE ON mlm.partners
FOR EACH ROW EXECUTE FUNCTION update_partner_referral_count();Отсутствующее ограничение внешнего ключа
sql
-- Добавляем FK для promo_code_id в заказах (отсутствовало)
ALTER TABLE product.orders
ADD CONSTRAINT fk_orders_promo_code
FOREIGN KEY (promo_code_id) REFERENCES product.promo_codes(id);Начальные данные
Роли
sql
INSERT INTO core.roles (name, description, is_system) VALUES
('USER', 'Базовый пользователь платформы', TRUE),
('PARTNER', 'MLM-партнер с реферальными правами', TRUE),
('MODERATOR', 'Модератор контента и KYC', TRUE),
('ADMIN', 'Администратор платформы', TRUE),
('SUPER_ADMIN', 'Полный доступ к платформе', TRUE);Ранги по умолчанию
sql
INSERT INTO mlm.ranks (name, code, level, description) VALUES
('Новичок', 'STARTER', 1, 'Начальный уровень'),
('Консультант', 'CONSULTANT', 2, 'Первые продажи'),
('Менеджер', 'MANAGER', 3, 'Активная сеть'),
('Директор', 'DIRECTOR', 4, 'Значительный объем'),
('Топ Лидер', 'TOP_LEADER', 5, 'Ведущий партнер');