Ограничение внешних ключей с отзывом
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: не забудьте проработать юридический аспект, имеете ли вы право отображать отзывы пользователя, который запросил удаление своих данных.