Отслеживание внешних файлов с базой данных SQL и удаление внешнего файла при удалении записи для него - PullRequest
5 голосов
/ 13 июня 2011

Понятия не имею, правильно ли я поступаю по этому поводу, или я делаю что-то совершенно глупо.

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

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

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

Как удалить файл из файловой системы, когда я удаляю запись из базы данных?

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

Я надеюсь, что это не имеет значения, но я использую postgre в качестве базы данных SQL под Linux.

РЕДАКТИРОВАТЬ: моя текущая стратегия заключается в использовании сценария оболочки, который обрабатывает удаление изображения.Во время сценария оболочки он создает файл транзакции для удаления всех записей базы данных, связанных с изображением, сохраняя полный путь к файлу в текстовом файле.Если транзакция прошла успешно, я удаляю изображение в плоском файле.Это разумно?Есть ли лучший способ?

Ответы [ 4 ]

6 голосов
/ 14 июня 2011

Многое зависит от того, ГДЕ вы хотите поместить свои изображения.

Поскольку базе данных обычно требуется быстрый случайный ввод-вывод, вы положите ее в коробку с хорошим резервным контроллером RAID10 для батарей.

Но веб-серверу, обслуживающему миллиарды в основном статических (не часто обновляемых) файлов, потребуется совсем другое оборудование, вероятно, RAID6 или облако дешевых серверов.

Так что вы должны принять это во внимание в своем проекте.

1) Триггер ON DELETE

База данных может быть удалена с помощью триггера ON DELETE.Большая проблема: если транзакция откатывается, файлы остаются удаленными!

2) таблица журналов

Триггер ON DELETE вставляет удаленные записи изображений в таблицу журналов.Задание cron читает это и позже удаляет файлы.

==> Нет проблем с ROLLBACK

3) сборка мусора

Задание cron сравнивает список файлов на диске исодержимое базы данных и удаляет на диске файлы без соответствующей записи базы данных.

Это безопасно, но, вероятно, намного медленнее, чем таблица журнала!

4) сделать это в приложении:

  • DELETE RETURNING возвращает список удаленных записей, COMMIT
  • удалить из файловой системы

Точки сбоя:

  • вы можетеполучать файлы без записей базы данных, если ваше приложение умирает, или наоборот, если вы ставите COMMIT после unlink (), что было бы хуже.
  • То же самое относится и к INSERTs ...
  • , если что-токроме того, что приложение удаляет из базы данных, оно не обрабатывается.
2 голосов
/ 13 июня 2011

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

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


ОБНОВЛЕНИЕ : Если вам нужно, чтобы это было очень быстро, вы можете попробовать удалить файлы с помощью задания cron. Раз в пару часов (или в день, или в любое другое время) задание cron может сравнивать базу данных с файловой системой и удалять любые случайные изображения. Это упростит массовое удаление из базы данных: вы сможете сделать DELETE FROM whatever WHERE ..., чтобы уничтожить несколько записей, и тогда ваш уборщик придет позже, чтобы очистить оставшиеся изображения.

1 голос
/ 13 июня 2011

Существует функция PHP для удаления файлов из файловой системы:

unlink(filename)
0 голосов
/ 13 июня 2011

Как удалить файл из файловой системы при удалении записи из базы данных?

Для этого можно использовать скрипт pl / perlu.Однако, если файл не хранится в виде lob, не делайте этого.Подумайте, что может произойти, если произойдет ошибка и транзакция будет отменена.

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

...