Удалить объект из графа объекта, сохранив целостность - PullRequest
2 голосов
/ 27 марта 2012

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

Например - когда продукт удален, каков наилучший способ убедиться, что заказы, содержащие этот продукт, по-прежнему актуальны, или, кроме того, счета-фактуры, содержащие заказы, содержащие этот продукт, по-прежнему актуальны?

Ответы [ 2 ]

2 голосов
/ 05 апреля 2012

Существует в основном 3 «стандартных решения»:

Решение 1

Вам нужен продукт (как в вашем случае из-за ссылок на него).Это означает, что данные являются действительными, и единственное изменение заключается в том, что они «отсутствуют в наличии» или «отсутствуют в портфеле».В любом случае ваш бизнес-процесс часто требует, чтобы вы обрабатывали ситуации RMA или некоторые связанные с IRS вопросы, например ... это означает, что продукт не должен быть удален.Это просто другое «состояние» продукта, которое должно отражаться в вашей модели данных БД и т. Д.

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

Решение 2

Вам вообще не нужны никакие данные ... просто выполните каскадное удаление и покончите с этим ...

Решение 3

Вам нужно толькоисторические данные, но никакому «будущему бизнес-процессу» никогда не понадобится эта сущность (то есть продукт) снова ... в этом случае обычным решением является создание архивных таблиц, которые заполняются перед каскадным удалением «активных / продуктивных таблиц».Небольшой вариант этой схемы - копирование необходимой информации в «зависимые строки» (счет в вашем случае) и просто удаление активной / производительной строки (т. Е. Продукта в вашем случае).

Заключение

Сложные системы имеют дело с множеством различных бизнес-процессов / вариантов использования и, таким образом, имеют тенденцию использовать все вышеперечисленные методы - каждый имеет свое место в зависимости от конкретных бизнес-процессов / вариантов использования ...

0 голосов
/ 06 апреля 2012

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

Я не собираюсь принимать свой собственный ответ или обходить награду, но просто показываюего ответ.

"С помощью полнофункциональной СУБД вы можете разбить таблицу на столбец" delete_or_not ", что приведет к компактному сохранению всех рабочих строк производства. Если вы не хотите использовать устаревшиеданные, которые отображаются в отчетах, просто дают полной таблице непонятное имя, такое как Customers_include_deleted_rows, и создают представление «клиенты» (содержащее только текущие строки), из которого запрашивается большая часть кода приложения. Это предполагает, конечно, чтонекоторая ценность иметь старые данные вокруг. "

...