-- +goose Up CREATE TABLE IF NOT EXISTS user_agreements ( id SERIAL PRIMARY KEY, -- user_id NULL-able: при удалении аккаунта FK-ограничение обнуляет -- ссылку (ON DELETE SET NULL), а сама запись об акцепте остаётся в -- обезличенном виде (факт согласия, ст. 9 ч. 4 152-ФЗ — бремя -- доказывания на операторе). Персональные данные внутри записи -- (ip, user_agent) обнуляет users_repo.DeleteUser. user_id INTEGER, agreement_type VARCHAR(50) NOT NULL, version VARCHAR(50) NOT NULL, accepted_at TIMESTAMP NOT NULL DEFAULT NOW (), ip VARCHAR(45), user_agent TEXT, CONSTRAINT fk_user_agreements_user FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE SET NULL, CONSTRAINT uq_user_agreement UNIQUE (user_id, agreement_type, version), CONSTRAINT chk_user_agreement_type CHECK (agreement_type IN ('terms', 'privacy')) ); -- Отдельный индекс по user_id не нужен: UNIQUE (user_id, agreement_type, version) -- уже покрывает выборки по префиксу user_id. -- +goose Down DROP TABLE IF EXISTS user_agreements;