Являются ли плоские файловые базы данных хорошими?

Необходимые сведения о достоинствах файловой базы данных. Я рассматриваю возможность использования схемы базы данных с плоскими файлами для управления данными для настраиваемого блога. Он будет развернут в варианте ОС Linux и написан на Java.

Каковы возможные негативы или положительные стороны в отношении производительности для чтения и написания статей и комментариев?

Будет ли извлечение извлечения статьи из-за того, что это плоский файл, а не RDBMS, если он должен быть привязан к черту? (Желательное мышление)

Я не против использования РСУБД, просто спрашиваю сообщество об их жизнеспособности такой схемы архитектуры программного обеспечения.

Follow Up: В случае с этим вопросом я бы увидел "Flat file == на основе файловой системы". Например, каждая запись в блоге и сопровождающие ее метаданные были бы в одном файле. Создание для многих файлов, организованных по дате структуры папок файлов (блоги\testblog2\2008\12\01) == 12/01/2008

Ответ 1

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

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

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

Но вы можете, например, с надлежащей блокировкой, сделать "атомное" обновление индекса, используя основные команды файловой системы, по крайней мере, в Unix.

Простой случай заключается в том, что процесс индексирования выполняется через данные для создания нового индексного файла под временным именем. Затем, когда вы закончите, вы просто переименуете (либо переименование системного вызова (2), либо команду shell mv) старый файл поверх нового файла. Переименовать и mv являются атомарными операциями в системе Unix (т.е. Либо работает, либо нет, и там никогда отсутствует "между состоянием" ).

То же самое с созданием новых записей. В основном напишите файл полностью в файл temp, затем переименуйте или mv его в свое последнее место. Тогда у вас никогда не будет "промежуточного" файла в "БД". В противном случае у вас может быть состояние гонки (например, процесс чтения файла, который все еще записывается, и может дойти до конца процесса записи) - уродливое состояние гонки).

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

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

Если вы помещаете миллион файлов в каталог, могут возникнуть проблемы с настройкой, на которые вы хотите посмотреть, но из этого окна большинство из них легко справятся с 10 тысячами. Просто помните, что если вам нужно СКАНИРОВАТЬ каталог, там будет много файлов для сканирования. Разделение через каталоги помогает предотвратить это.

Но все зависит от ваших методов индексирования и поиска.

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

Наконец, конечно, у вас есть множество бесплатных инструментов уровня файловой системы Unix в вашем распоряжении, но у всех их есть проблемы с zillions файлов (forking grep 1000000 раз, чтобы найти что-то в файле, будет иметь компромисс производительности - накладные расходы просто складываются).

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

Например, у вас может быть "сегодняшний" каталог, "вчерашний" каталог, "java" каталог и фактический каталог сообщений.

Итак, сообщение может быть связано в "сегодняшнем" каталоге, в каталоге "java" (потому что сообщение помечено как "java", скажем) и в его последнем месте (например,/articles/2008/12/01/my_java_post.txt). Затем, в полночь, вы запускаете два процесса. Первый принимает все файлы в "сегодняшнем" каталоге, проверяет их дату создания, чтобы убедиться, что они не являются "сегодняшними" (так как процесс может занять несколько секунд и может прорваться новый файл) и переименовывает эти файлы в "вчера" . Затем вы делаете то же самое для "вчерашнего" каталога, только здесь вы просто удаляете их, если они устарели.

Между тем файл все еще находится в каталоге "java" и ".../12/01". Поскольку вы используете файловую систему Unix и жесткие ссылки, "файл" существует только один раз, все это всего лишь указатели на файл. Ни один из них не является "файлом", они все одинаковы.

Вы можете видеть, что, хотя каждый отдельный ход файла является атомарным, объем не является. Например, в то время как "сегодня" script работает, "вчерашний" каталог может содержать файлы как "вчера", так и "за день до", потому что "вчера" script еще не запущен.

В транзакционной БД вы сделаете это все сразу.

Но, просто, это проверенный метод. Unix, в частности, очень хорошо работает с этой идиомой, и современные файловые системы также могут хорошо ее поддерживать.

Ответ 2

(ответ скопирован и изменен с здесь)

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

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

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

Ответ 3

Это было сделано с asp.net с Dasblog. Он использует хранилище на основе файлов.

В этой старой ссылке указано несколько деталей. http://www.hanselman.com/blog/UpcomingDasBlog19.aspx

Вы также можете получить более подробную информацию о http://dasblog.info/Features.aspx

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

Ответ 4

Написание собственного движка в собственном коде может превзойти базу данных общего назначения.

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

Нет ничего плохого, чем изобретать колесо (в конце концов, Linux был именно этим), но помните о своих ожиданиях и времени.

Ответ 5

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

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

Ответ 6

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

Ответ 7

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

Ответ 8

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

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

Программное обеспечение СУБД также использует их для журналов.

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

Ответ 9

Базы данных с плоским файлом возможны, но учитывайте следующее.

Базы данных должны получать все элементы ACID (атомарность, согласованность, изоляция, долговечность), и если вы собираетесь обеспечить, чтобы все было сделано в плоском файле (особенно с одновременным доступом), вы в основном пишете полный -думанная СУБД.

Итак, почему бы не использовать полномасштабную СУБД в первую очередь?

Вы сэкономите время и деньги, связанные с написанием (и переписыванием много раз, я гарантирую), если вы просто зайдете с одним из бесплатных вариантов (SQLite, MySQL, PostgresSQL и т.д.).

Ответ 10

Вы можете использовать базы данных файлов fiat, если они достаточно малы, не потеряли случайного доступа. Большой файл с множеством случайного доступа будет очень медленным. И никаких сложных запросов. Нет объединений, нет суммы, группы и т.д. Вы также не можете ожидать получения иерархических данных из плоского файла. Формат XML намного лучше для сложных структур.

Ответ 11

Отметьте http://jsondb.io в базе данных на базе Java с открытым исходным кодом есть большая часть того, что вы ищете. Сохраняет данные как плоские .json файлы, поддержку многопоточности, поддержку шифрования, поддержку ORM, поддержку Atomicity, расширенную поддержку запросов на основе XPATH.

Отказ от ответственности: я создал эту базу данных.