Files
backend/migrations/00003_create_users_table.sql
2025-12-13 22:34:01 +05:00

60 lines
2.4 KiB
SQL

-- +goose Up
-- +goose StatementBegin
-- =========================================
-- ТАБЛИЦА: users - Пользователи системы
-- =========================================
CREATE TABLE users (
id BIGSERIAL PRIMARY KEY,
-- Аутентификация
email VARCHAR(255) NOT NULL UNIQUE,
phone VARCHAR(20),
password_hash VARCHAR(255) NOT NULL,
-- Профиль
first_name VARCHAR(100) NOT NULL,
last_name VARCHAR(100) NOT NULL,
avatar_url TEXT,
-- Геолокация (домашний адрес)
location GEOGRAPHY(POINT, 4326),
address TEXT,
city VARCHAR(100),
-- Статистика для волонтёров (денормализация для производительности)
volunteer_rating NUMERIC(3, 2) DEFAULT 0.00 CHECK (volunteer_rating >= 0 AND volunteer_rating <= 5),
completed_requests_count INTEGER DEFAULT 0 CHECK (completed_requests_count >= 0),
-- Статусы
is_verified BOOLEAN DEFAULT FALSE,
is_blocked BOOLEAN DEFAULT FALSE,
email_verified BOOLEAN DEFAULT FALSE,
-- Аудит
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
last_login_at TIMESTAMP WITH TIME ZONE,
deleted_at TIMESTAMP WITH TIME ZONE
);
-- Комментарии
COMMENT ON TABLE users IS 'Пользователи системы: маломобильные граждане, волонтёры, модераторы';
COMMENT ON COLUMN users.location IS 'Координаты домашнего адреса в формате WGS84 (SRID 4326)';
COMMENT ON COLUMN users.volunteer_rating IS 'Средний рейтинг волонтёра (0-5), обновляется триггером';
COMMENT ON COLUMN users.completed_requests_count IS 'Количество выполненных заявок, обновляется триггером';
COMMENT ON COLUMN users.deleted_at IS 'Soft delete - дата удаления пользователя';
-- Индексы
CREATE INDEX idx_users_email ON users(email);
CREATE INDEX idx_users_phone ON users(phone) WHERE phone IS NOT NULL;
CREATE INDEX idx_users_is_blocked ON users(is_blocked) WHERE is_blocked = TRUE;
CREATE INDEX idx_users_deleted_at ON users(deleted_at) WHERE deleted_at IS NULL;
-- +goose StatementEnd
-- +goose Down
-- +goose StatementBegin
DROP TABLE IF EXISTS users CASCADE;
-- +goose StatementEnd