Я работаю над программным обеспечением, которое хранит файлы в файловой системе, а также ссылки на эти файлы в базе данных. Таким образом, запрос загруженных файлов может быть выполнен в базе данных без необходимости доступа к файловой системе. Из того, что я читал в других сообщениях, большинство людей говорит, что лучше использовать файловую систему для хранения файлов, а не хранить двоичные данные непосредственно в базе данных в виде 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");
Этот вариант лучше, но сделает возможным для кого-то, чтобы загрузить файл в системе, которая никогда не ссылается. Хотя это можно было бы исправить с помощью функции «Очистить» или «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, потому что это просто, и мне не нужно беспокоиться о том, что пользователи пытаются запросить файлы до их загрузки. Хранение дешево, так что это не конец света, если я получаю некоторые ненужные файлы, занимающие место. Но это также кажется общей проблемой, и я хотел бы услышать, как другие решили это или другие соображения, которые я должен делать.
Очень умный вопрос. Многие люди никогда не думают о согласованности между своими разрозненными хранилищами данных. – usr