Я пишу простую систему управления документами для своей работы. Я всего лишь любитель, но уже некоторое время программирую. Моя проблема заключается в следующем. Когда я удаляю несколько документов через свое приложение, мне нужно удалить соответствующие записи базы данных. Каков наилучший способ сделать это, не получая файлов без записей базы данных или записей, указывающих на файлы, которые не существуют, если возникает исключение?
Управление документами
Ответы (7)
Храните файлы в базе данных. Тогда вы можете иметь ссылочную целостность, не добавляя сложности (MSMQ и т. д.) к вашему приложению. Да, это увеличит размер вашей базы данных. Но файлы уже у вас на сервере, так что просто те же биты в другом месте.
Это своего рода система «распределенных транзакций». Вы, вероятно, захотите написать процедуру консолидации и запускать ее время от времени, в какой-то момент у вас будут возникать несоответствия.
Вы сказали «через мое приложение». Означает ли это, что они могут удалять файлы только через интерфейс приложения? Если это так, заверните удаление в пользовательскую транзакцию, чтобы удалить файл и удалить запись базы данных. Если одна сторона не удалась, откатите другую.
Если вы хотите разрешить им удалять файлы из файлового каталога, а затем автоматически удалять записи базы данных, вы можете делать множество вещей, включая периодическую очистку и/или службу Windows-наблюдателя файловых каталогов, которая отслеживает активность в каталоге и Затем начинается уборка.
Спасибо за ваши ответы. Я уже думал пойти по маршруту BLOB, но не был уверен, что мой босс пойдет на это. Ему нравится хорошая структура каталогов, понимаете? Что касается распределенных транзакций, я ничего о них не знал, но они кажутся наиболее профессиональным подходом к этому. Но я любитель, и все это кажется слишком сложным, поэтому я собираюсь выиграть раунд у своего босса на фронте BLOB. Ваше здоровье.
Вы должны использовать распределенную транзакцию, которая будет включать вашу базу данных и очередь сообщений MS (MSMQ). Убедитесь, что ваша база данных может быть зарегистрирована в распределенной транзакции с помощью координатора распределенных транзакций Microsoft (DTC).
Запрограммируйте все операции с файлами с помощью MSMQ.
Эта ссылка может вам помочь
У меня есть аналогичная функциональность в некоторых моих приложениях.
Что я делаю, так это сначала удаляю файл через AP, а затем удаляю запись базы данных, в которой есть ссылка/указатель на файл. Когда пользователи запрашивают документ (что означает, что ссылка на файл все еще существует в базе данных), приложение сначала проверяет наличие файла, и если по какой-то причине его там нет, как ожидается, оно очищает запись в базе данных. в этот момент и изящно уведомляет пользователя об «ошибке».
В любом случае «осиротевшие» документы случаются редко, но использование этого метода гарантирует постоянную очистку базы данных как обычную часть работы приложения.
Есть много других способов справиться с этим, но этот работает для меня.
Сначала удалите записи базы данных и время от времени проверяйте репозиторий. Под аудитом репозитория я подразумеваю поиск файлов, которые не имеют записи в базе данных. Если вы сначала удалите запись БД, ваш код не будет искать документы, которых на самом деле нет.
Сколько документов и какие типы документов вы планируете хранить?