Использование памяти файла против базы данных для простого хранения данных - PullRequest
1 голос
/ 31 мая 2011


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

Поскольку каждый файл находится на сервере, я обсуждаю необходимость записи в базе данных MySQL, соответствующей каждому файлу. Следующая информация должна храниться в каждом файле / каталоге для каждого пользователя:

  1. Было ли оно удалено или нет (так как удаления должны быть синхронизированы с другими клиентами)
  2. Отметка времени последнего изменения каждого файла (поэтому я знаю, нуждается ли клиент в обновлении файла)

Я мог бы хранить обе эти части информации в файлах (например, .deleted file и .modified файл в каждом каталоге пользователя, содержащем пути к файлам + метки времени в последнем) или в базе данных.

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

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

Ответы [ 3 ]

1 голос
/ 31 мая 2011

Вероятно, вариант файловой системы будет более эффективным в отношении памяти, если количество файлов невелико, но это решение, вероятно, не масштабируется.Базы данных оптимизированы именно для этого.Поиск в файловой системе, открытие файла, поиск в документе будут дорогостоящими по мере увеличения количества файлов и запросов.

Но никто не говорит, что вы должны использовать MySQl.База данных NoSQL, такая как Redis, или, может быть, что-то вроде CouchDB (где вы можете сохранить сам файл и включить управление версиями) может быть более привлекательным решением.

здесь быстрое сравнение баз данных NoSQL более длинное сравнение .

Редактировать: Исходя из ваших комментариев, я бы построил это следующим образом: создайте API, абстрагирующий бэкэнд от всех операций, которые вы хотите выполнить.Затем реализуйте внутреннюю часть с помощью 2 или 3 операций, которые выполняются чаще всего или могут быть более дорогостоящими для файловой системы и для базы данных (или двух).Тест и тест.

0 голосов
/ 31 мая 2011

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

0 голосов
/ 31 мая 2011

Я бы выбрал одну из баз данных NoSQL.Вы можете хранить содержимое файла и предоставлять некоторые ключевые функции на основе идентификаторов пользователя, чтобы извлекать их, когда они вам нужны. Redis или Casandra может быть хорошим выбором для этого случая.Существует много библиотек для использования этих баз данных в Python, а также во многих других языках.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...