Управление документами

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


person Community    schedule 12.01.2009    source источник


Ответы (7)


Храните файлы в базе данных. Тогда вы можете иметь ссылочную целостность, не добавляя сложности (MSMQ и т. д.) к вашему приложению. Да, это увеличит размер вашей базы данных. Но файлы уже у вас на сервере, так что просто те же биты в другом месте.

person jcollum    schedule 12.01.2009
comment
Мы делаем это, и нам нравится контроль транзакций, но вам нужно быть немного осторожным. Если файлы не слишком большие, никаких проблем, но нас укусили, когда пользователь попытался сохранить 200-мегабайтный (да, мегабайт!!) текстовый документ (не спрашивайте) в базу данных по сети. Это заняло ооооооочень много времени и истекло. - person ChrisA; 12.01.2009

Это своего рода система «распределенных транзакций». Вы, вероятно, захотите написать процедуру консолидации и запускать ее время от времени, в какой-то момент у вас будут возникать несоответствия.

person Otávio Décio    schedule 12.01.2009

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

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

person Mark A Johnson    schedule 12.01.2009

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

person woodstock    schedule 12.01.2009

Вы должны использовать распределенную транзакцию, которая будет включать вашу базу данных и очередь сообщений MS (MSMQ). Убедитесь, что ваша база данных может быть зарегистрирована в распределенной транзакции с помощью координатора распределенных транзакций Microsoft (DTC).

Запрограммируйте все операции с файлами с помощью MSMQ.

Эта ссылка может вам помочь

person Igor Zelaya    schedule 12.01.2009

У меня есть аналогичная функциональность в некоторых моих приложениях.

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

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

Есть много других способов справиться с этим, но этот работает для меня.

person E.J. Brennan    schedule 12.01.2009

Сначала удалите записи базы данных и время от времени проверяйте репозиторий. Под аудитом репозитория я подразумеваю поиск файлов, которые не имеют записи в базе данных. Если вы сначала удалите запись БД, ваш код не будет искать документы, которых на самом деле нет.

Сколько документов и какие типы документов вы планируете хранить?

person Jim Blizard    schedule 12.01.2009