Как не оставлять объекты помеченными как удаленные? - PullRequest
0 голосов
/ 05 января 2010

Сценарий: «Счет-фактура» имеет ссылку на класс «Пользователь». Пользовательский объект удаляется через самого пользователя или администратора, но объекту счета-фактуры по-прежнему нужен получатель (пользователь).

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

Физическое их удаление облегчает некоторые вещи: каскадное удаление, выбор, резервное копирование базы данных ...

Как мне избежать использования объектов, помеченных как удаленные? Какой дизайн мне нужен, чтобы иметь возможность физически удалять неиспользуемые объекты из базы данных? Есть ли лучшие практики?

Контекст: приложение ООП (DDD) на основе Java EE и реляционной базы данных.

Ответы [ 5 ]

2 голосов
/ 05 января 2010

Является ли это вашим реальным сценарием, в котором счет и пользователь означают то, что, я думаю, они имеют в виду?

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

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

2 голосов
/ 05 января 2010

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

0 голосов
/ 05 января 2010

Зачем вам нужно хранить удаленную информацию? Как правило, вам нужно сохранить его для аудита, соответствия или юридических требований.

Обычно достаточно иметь возможность воспроизвести более ранние состояния базы данных. База данных будет поддерживать это.

Для большинства целей важно

  1. Журнал каждой операции удаления
  2. Возможность отслеживать, когда и кем была удалена запись.

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

0 голосов
/ 05 января 2010

Не уверены, что вам нужно сохранить счет?

если да, то у вас есть несколько вариантов. Одним из них является сохранение пользователя с удаленным флагом. Если вы не знаете, кем был первоначальный пользователь, создайте объект-пользователь «Удаленный пользователь». Вы можете связать свой счет с этим удаленным пользователем.

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

0 голосов
/ 05 января 2010

На уровне базы данных у вас есть как минимум две надежные альтернативы.

1) Вы не можете удалить пользователя, если существуют связанные счета.

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

Я согласен с вами, что простая маркировка счета как удаленного является плохой практикой. Если он действительно был удален, он должен выйти из базы данных (или, возможно, где-нибудь заархивироваться).

Randy

...