60 lines
2.4 KiB
SQL
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
|