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

Обычно я просто использовал бы SQL / SQLite / Mongo для любой базы данных, но я подумал, что было бы интересно попытаться создать собственную структуру базы данных с плоскими файлами (это всего лишь учебный проект).Само приложение представляет собой музыкальный стример с централизованной библиотекой на сервере.

База данных:

Мое приложение является клиент-серверным, и любые изменения, вносимыесервер синхронизируется со всеми клиентами.Серверы выполняют операции вставки, редактирования и удаления.

Клиенты могут изменять только логическое поле модификатора клиента в записи (значение которого зависит от данного клиента).Другие операции недоступны для клиентов, поэтому никаких синхронизирующих изменений нет.

Операции записи на сервере редки после первоначального построения базы данных, но происходят.Приоритет здесь определенно - операции чтения для клиентов.

Требуется масштабирование до 500 тыс. Треков или до 2 ГБ (2 ^ 31 байт) размера файла базы данных (который когда-либо будет первым).

Что хранится:

  • Несколько таблиц, с некоторыми отношениями.Это всего лишь макет, но вы понимаете:
+--------+         +--------+         +-------------------+
| id*    |         | id*    |         | id*               |
| ARTIST | ------> | ARTIST |         | track name        |
|        |         | ALBUM  | ------> | ALBUM             |
|        |         | year   |         | length            |
|        |         |        |         | filename**        |
|        |         |        |         | {client modifier} |
+--------+         +--------+         +-------------------+

* unique identifier
** not stored in client version of database
{client modifier} is only on the client version of database

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

  • Все поля имеют переменную длину, кроме идентификатора, года и длины.

Обязательные функции:

  • Разрешитьсинхронизировать базу данных со всеми клиентами с минимальными операциями.

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

  • Операции быстрого чтения для клиентов

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

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

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

  • Минимизация операций ввода-вывода

Сервер будетсохраните «индекс» базы данных треков в памяти с идентификатором и именем файла, чтобы операции чтения были сведены к минимуму.

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

  • НЕ разреженный файл, чтобы размер файла был минимальным.

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

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

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

Комментарии:

Так, как мне пойти на это и максимизировать производительность?

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

Так у кого-нибудь есть мысли / комментарии / идеи?

Спасибо за чтение.

Ответы [ 2 ]

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

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

Просмотр ваших функций по одному:

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

Для этого требуется журнал изменений базы данных. У вас правильная идея.

Операции быстрого чтения для клиентов

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

Минимизация операций ввода-вывода

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

НЕ разреженный файл, чтобы размер файла был минимальным

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

Удачи.

0 голосов
/ 22 марта 2014

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

По структуре данные сортируются по папкам, файлам и т. Д. Я также считаю, что закрытие файлового соединения при каждом выполнении запроса экономит память.

Пожалуйста, разберитесь со мной, это было предложено несколько лет назад, поэтому я до сих пор использую ASP Теперь я использую Ruby-on-Rails и NodeJS (и немного PHP)

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

5 основных целей делегирования данных из папок и файлов

Структура

Database/


    Table1/


        Fieldsinfo/


            username.mapper (file to provide info about the username field)


            password.mapper (file to provide info about the password field)


        Records/


            username/


                recordid1.tabledata (file that contains the data/value)


                recordid2.tabledata (file that contains the data/value)


            password/


                recordid1.tabledata (file that contains the data/value)


                recordid2.tabledata (file that contains the data/value)         

…
  1. Скорость а. Предлагая черновую структурированную систему баз данных и избегая переписывания / поиска в огромной базе данных каждый раз, когда выполняется операция, делегирование файлов и папок направлено на повышение скорости репутации систем баз данных с плоскими файлами. я. Папка-файл данных Делегирование хранит данные с использованием папок и файлов, нет необходимости структурировать одну файловую базу данных для систем баз данных с плоскими файлами, когда вы можете просто запросить запись по ее физическому пути, процесс запроса (поиск / обновление / удаление / сортировка и т. д.) коллекция записей (таблица) дополнительно упрощается и расширяется за счет использования оперативных запросов, что надежно лучше, чем SQL. Скорость повышается за счет перезаписи небольшого файла, содержащего информацию об отдельной записи, вместо перезаписи всей базы данных. Папка-файл данных делегирования также хранит карты ключей, что еще больше упрощает проверку новых входных данных. Кроме того, вы можете создавать порталы с неограниченным доступом для своего приложения, когда один портал используется, новый файл портала будет клонирован и операции будут создаваться одновременно, а не последовательно (предупреждение: это может привести к перегрузке ОЗУ, используйте на свой страх и риск и ограничьте количество порталов числом, соответствующим мощности вашего процессора). II. Отказ от ответственности: Мы не утверждаем, что делегирование данных из папок и файлов является самой быстрой из когда-либо созданных баз данных, а скорее заявляем, что скорость эффективно повышается с помощью такого алгоритма.
  2. Согласованность а. Предлагая черновую структурированную систему баз данных и черновые определенные компоненты, такие как коллекции, записи и поля, делегирование файлов и папок направлено на улучшение согласованности систем баз данных с плоскими файлами. я. Передача данных из папок и файлов организует данные таким образом, что они эффективно распределяются почти так же, как в
  3. Базы данных - составлены из взаимосвязанных коллекций (папка)
  4. Коллекции - составленные из взаимосвязанных уникальных записей (папка)
  5. Записи - составлены из взаимосвязанных базовых единиц данных (папка)
  6. Поля - состоят из единой единицы данных (текста, символа, целого числа, массива, объекта) и имеют указанную длину для ускорения и безопасности запросов. (файл, который отображается (определяется) полевым сопоставителем коллекции)
  7. Security а. Предлагая черновую структурированную систему баз данных и NoSQL, а также строгую фильтрацию возможных атак на базу данных, Folder-File Data Delegation стремится улучшить безопасность систем баз данных с плоскими файлами. я. Папка-файл данных делегирования предлагает данные NoSQL, и все данные в запросе интерпретируются как данные, а не как команда. Запросы - это просто доступ к физическому пути и операции передачи, которые должны выполняться на используемом языке программирования. Это похоже на сервисную компанию, идущую к вам домой и предоставляющую вам услуги и прочее, где ваш дом - это та запись, которой манипулируют.
  8. Простота а. ПредлагаяПроект структурированной системы и проект документированных и проект запланированных презентаций концепций. Делегирование папок-файловых данных направлено на повышение безопасности систем баз данных с плоскими файлами.я.Папка-файл данных Делегирование предлагает графический интерфейс, поэтому вам не нужно вручную выполнять операции и команды, если вы хотите изменить вещи и т. Д. Операции также упрощаются с взаимодействиями пользовательского интерфейса.
  9. Гибкость a.Предлагая черновую структурированную систему и абстрактно спланированные динамические обновления структуры базы данных, делегирование файлов и папок направлено на повышение гибкости систем баз данных с плоскими файлами.я.Передача данных из папок и файлов регулярно обновляется и поддерживается, если когда-либо ваша база данных подвергается атаке со стороны определенного хакера, который может представлять угрозу и т. Д. Не беспокойтесь;Ваша папка базы данных хранится в скрытой папке (.folder).
...