2009-02-03 1 views
11

У SQL всегда была отличная возможность: каскадные удаления. Вы планируете это заранее, и когда пришло время что-то удалить, БАМ! Не нужно беспокоиться обо всех этих зависимых записях.Cascading Soft Delete

Однако в настоящее время это почти табу на самом деле УДАЛИТЬ все. Вы отмечаете его как удаленное и прекратите показывать его. К сожалению, я не смог найти твердого решения для этого, когда есть зависимые записи. Я всегда вручную кодировал сложную сеть мягких удалений.

Есть ли лучшее решение, которое я полностью пропустил?

ответ

13

Ненавижу говорить об этом, но триггеры разработаны специально для такого рода вещей.

(Часть ненависть, потому что хорошие спусковые очень трудно писать и, конечно же, не может быть отлажена)

0

Не уверен, что бакэнду вы говорите, но вы могли бы пикап на своем «удалить флаг» изменение и каскадное изменение вниз с помощью триггера.

6

Внешние ограничения ключа могут выполнять каскадные обновления. Если вы привязали свои таблицы как к ключу, так и к флагу удаления, тогда, когда флаг удаления в главной таблице изменился, это изменение распространилось бы до таблицы подробностей. Я этого не пробовал, но он должен работать.

+0

Это безумно элегантный ИМО. Единственная проблема с этим - вы не можете использовать NULL Delete_Date, но вместо этого должны использовать какую-то произвольную дату, например «9999-12-31». – HaxElit

+1

Подумав немного больше, это не сработает, потому что если вы мягко удаляете зависимую запись, вы получаете ошибку ограничения ключа, потому что дата удаления родителя отличается. Чтобы быть правдой, я думаю;) – HaxElit

2

Я думаю, что польза от мягких удалений обычно заключается в том, что не каждая таблица имеет флаг soft-delete, поэтому количество вещей, необходимых для каскадирования, невелико. Строки просто не используются в базе данных, но не потеряны - на них просто ссылаются только удаленные строки.

Как и все, это зависит от вашей модели.

+0

Хм, но тогда у вас есть база данных, полная строк, не видя сразу, что используется - правильно? Вы можете присоединиться к основной таблице, но если каскад проходит несколько уровней, это может стать беспорядочным. Или я чего-то не хватает? – Piskvor

+1

Это зависит от модели. В реляционном дизайне, если удаленный флаг не принадлежит в отношении/tuple/table - то есть он не является атрибутом ключа, я бы не поставил его. В звездной схеме - вы поместите их только на основные таблицы. –

+0

Если вы приведете пример схемы подсистемы, я покажу вам, какие из них я бы поставил удаленный флаг. Я бы, например, никогда не помещал их в таблицу «многие ко многим», если вы не сохраняете историю изменений связей, и в этом случае вам также нужно будет добавить эффективные даты. –