Правовое основание, согласие и хранение — Примеры

Пример 1 — Одна строка на категорию данных

Команда составляет запись о приватности и написала одну строку: «данные пользователя — назначение: работа сервиса — основание: согласие — хранение: бессрочно». Такое предложение нельзя ни проверить аудитом, ни исполнить. Перепишите его в таблицу, которая команде действительно нужна, с основанием и сроком для каждой категории.

Черновик записи
  система:   клиентский портал
  данные:    данные пользователя
  зачем:     работа сервиса
  основание: согласие
  хранение:  бессрочно

Решение

Данные                     Назначение       Основание        Хранилище  Срок хранения
email, имя                 аккаунт + вход   договор          users      срок жизни аккаунта
IP-адрес                   защита от атак   законный интерес логи       30 дней
маркетинговые предпочтения рассылки         согласие         users      до отзыва
история заказов            исполнение       договор          orders     нормативный минимум

Таблица и есть артефакт; всё остальное — текст согласия, задачи удаления, решения о доступе — выводится из неё. Один и тот же человек теперь встречается в четырёх строках с разными основаниями и разными сроками, и в этом суть: согласие — правильный ответ только для маркетинговой строки, а данные, без которых сервис не работает, относятся к договору. Обычная ошибка — одна строка на систему: она скрывает необоснованные поля, и срок хранения к ней так и не привязывается.

Пример 2 — Флаг согласия, который ничего не отвечает

Форма регистрации хранит marketing_opt_in = true и больше ничего. Когда пользователь спрашивает, на что и когда он согласился, поддержке нечего ответить, а отзыв нельзя привязать к цели. Замените логическое значение записью, которую команда сможет защитить.

-- таблица users, как она построена
marketing_opt_in boolean not null default false

Решение

-- таблица consent, одна строка на цель
create table consent (
  user_id      bigint not null,
  purpose      text   not null,
  granted_at   timestamptz not null,
  text_version text   not null,
  withdrawn_at timestamptz
);
-- отзыв — это update, а не новое письмо в поддержку

Хранение даты, цели и версии показанного текста превращает «согласились ли они?» в факт, и согласие на рассылки больше не подменяет согласие на что-то другое. Отзыв обновляет строку, поэтому переключатель, поставивший согласие, снимает его. Обычная ошибка — оставить логическое значение и приписать рядом пункт политики; политика не может ответить на вопрос, который схема никогда не умела хранить.