Ограничение внешних ключей с отзывом

CREATE TABLE guseva.reviews (
    id_reviews serial4 NOT NULL,
    id_goods int4 NOT NULL,
    id_client int4 NOT NULL,
    rating int4 NOT NULL,
    "date" date NOT NULL,
    "comment" varchar NULL,
    CONSTRAINT reviews_check CHECK (((rating >= 1) AND (rating <= 5))),
    CONSTRAINT reviews_pk PRIMARY KEY (id_reviews),
    CONSTRAINT reviews_client_fk FOREIGN KEY (id_client) REFERENCES guseva.client(id_user) ON DELETE cascade ON UPDATE CASCADE,
    CONSTRAINT reviews_goods_fk FOREIGN KEY (id_goods) REFERENCES guseva.goods(id_goods) ON DELETE CASCADE ON UPDATE CASCADE
);

Думаю над тем, как организовать удаление пользователя из базы. Хотелось бы оставить при этом отзыв, но так как помимо таблицы client, есть еще user (с общей информацией) и login (с логинами) всё это усложнило бы создание записи по умолчанию. Не знаю как сделать оптимальнее (меньше избыточных данных, но при этом, чтобы удовлетворяло условию)


Ответы (1 шт):

Автор решения: Мелкий

Можно убрать NOT NULL для id_client и при удалении пользователя заменить его id_client на NULL в reviews. Это не противоречит ограничению foreign key. Простая логика вывода данных, только проверить на id_client is null.

Другой вопрос, не добавляете ли вы так себе организационных проблем. Может понадобиться найти все отзывы конкретного удалённого пользователя. Банально спам-рассылка, пользователь создал учётку - наспамил отзывов - удалил свою учётку. А вы потеряли возможность найти отзывы от этого конкретного пользователя. Можете найти только отзывы всех удалённых пользователей.

Куда чаще удаляемая учётная запись только помечается удалённой. Может быть с занулением данных, которые могут подходить под определение персональных данных, но сама строка, как правило, остаётся в таблице.

PS: не забудьте проработать юридический аспект, имеете ли вы право отображать отзывы пользователя, который запросил удаление своих данных.

→ Ссылка