Я работаю над программным обеспечением, которое хранит файлы в файловой системе, а также ссылки на эти файлы в базе данных. Таким образом, запрос загруженных файлов может выполняться в базе данных без доступа к файловой системе. Из того, что я читал в других сообщениях, большинство людей считают, что для хранения файлов лучше использовать файловую систему, чем хранить двоичные данные непосредственно в базе данных как BLOB.
Итак, теперь я пытаюсь понять, как лучше всего настроить это так, чтобы и база данных, и файловая система оставались синхронизированными, и я не получал ссылок на файлы, которые не существуют, или файлы, занимающие место в файловая система, на которую нет ссылок. Вот пара вариантов, которые я рассматриваю.
Вариант 1. Сначала добавьте ссылку на файл
//Adds a reference to a file in the database
database.AddFileRef("newfile.txt");
//Stores the file in the file system
fileStorage.SaveFile("newfile.txt",dataStream);
Этот вариант будет проблематичным, потому что ссылка на файл добавляется перед фактическим файлом, поэтому другой пользователь может в конечном итоге попытаться загрузить файл до того, как он будет фактически сохранен в системе. Хотя, поскольку ссылка на файл создается заранее, значение первичного ключа можно использовать при сохранении файла.
Вариант 2. Сначала сохранить файл
//Stores the file
fileStorage.SaveFile("newfile.txt",dataStream);
//Adds a reference to the file in the database
//fails if reference file does not existing in file system
database.AddFileRef("newfile.txt");
Этот вариант лучше, но он дает возможность кому-то загрузить в систему файл, на который никогда не ссылаются. Хотя это можно исправить с помощью функции «Purge» или «CleanUpFileSystem», которая удаляет все файлы, на которые нет ссылок. Этот параметр также не позволяет сохранять файл с использованием значения первичного ключа из базы данных.
Вариант 3: статус ожидания
//Adds a pending file reference to database
//pending files would be ignored by others
database.AddFileRef("newfile.txt");
//Stores the file, fails if there is no
//matching pending file reference in the database
fileStorage.SaveFile("newfile.txt",dataStream); database
//marks the file reference as committed after file is uploaded
database.CommitFileRef("newfile.txt");
Этот параметр позволяет создать первичный ключ перед загрузкой файла, но также не позволяет другим пользователям получить ссылку на файл до его загрузки. Тем не менее, возможно, что файл никогда не будет загружен, а ссылка на файл зависнет в ожидании. Тем не менее, также было бы довольно тривиально удалить ожидающие ссылки из базы данных.
Я склоняюсь к варианту 2, потому что он прост, и мне не нужно беспокоиться о том, что пользователи пытаются запрашивать файлы до их загрузки. Хранилище дешево, так что это не конец света, если некоторые файлы, на которые нет ссылок, занимают место. Но это тоже похоже на обычную проблему, и я хотел бы услышать, как другие решили ее, или другие соображения, которые я должен сделать.