Обработка удаленных данных в приложениях - PullRequest
1 голос
/ 16 сентября 2009

Предположим, что вы пишете простое приложение. Модель состоит в том, что у «проекта» есть «категория». Категория проекта может быть отредактирована путем выбора из выпадающего списка, который содержит все возможные категории.

Пользователь создает следующие категории: C1, C2, C3.

Пользователь создает следующие проекты, ассоциации категорий: [P1, C1], [P2, C2], [P3, C3]

Позже категория C2 была удалена. Теперь, если пользователь пытается изменить категорию Project P2, возникает несколько проблем: а. Категории должны быть найдены, чтобы заполнить выпадающий список. Но удаленные категории не будут восстановлены. Следовательно, C2 не будет восстановлен. (Если найдены удаленные категории, раскрывающийся список будет заполнен удаленными, неиспользуемыми полями)

б. Если C2 также извлекается, то существует риск, что пользователь может снова назначить удаленную категорию C2 для P2.

Какой лучший подход к дизайну для этого?

Ответы [ 7 ]

2 голосов
/ 17 сентября 2009

Я использовал поле «Устаревшее», которое не удаляет категорию из существования, просто скрывает соответствующие окна / выпадающие меню, но позволяет использовать данные в отчетах по историческим причинам.

2 голосов
/ 16 сентября 2009

Вы столкнулись с проблемой ссылочной целостности .

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

2 голосов
/ 16 сентября 2009

Не позволяйте им удалять C2. Или, альтернативно, разрешите им при необходимости удалить C2, но измените все категории C2 в системе на неопределенную категорию. Таким образом, они должны выбрать категорию при следующем редактировании проекта (и он по-прежнему действителен, поскольку он указывает на ранее созданную «неопределенную» категорию).

1 голос
/ 17 сентября 2009

Для обеспечения согласованности вы не можете удалить C2, но вы можете добавить опцию его отключения вместо фактического удаления. Таким образом, новые проекты не назначаются на C2.

1 голос
/ 17 сентября 2009

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

0 голосов
/ 17 сентября 2009

Я обработал это с помощью мягкого удаления, упомянутого другими.Затем при заполнении моего раскрывающегося списка я добавляю C2 в верхнюю часть раскрывающегося списка при изменении проекта, назначенного для C2 (только для удаленных категорий).Таким образом, все может быть в C2 и может быть перемещено из C2, но ничего нового не может быть помещено в C2 (потому что, если его нет в C2, его нет в выпадающем списке)что код для этого не был особенно красивым, но и не очень сложным.У меня нет проекта, открытого сейчас, но я могу добавить больше деталей позже, если вам интересно.

0 голосов
/ 17 сентября 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...