-- +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