initial commit
This commit is contained in:
59
migrations/00003_create_users_table.sql
Normal file
59
migrations/00003_create_users_table.sql
Normal file
@@ -0,0 +1,59 @@
|
||||
-- +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
|
||||
Reference in New Issue
Block a user