Пользовательские базы данных в виде плоских файлов - как их создать?

Обычно я бы просто использовал 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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Итак, как мне добиться этого и максимизировать производительность?

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

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

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


person Cheetah    schedule 19.05.2011    source источник


Ответы (2)


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

Рассматривая ваши функции по очереди:

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

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

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

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

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

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

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

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

Удачи.

person Gilbert Le Blanc    schedule 19.05.2011

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

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

Пожалуйста, объясните мне, что это было предложено несколько лет назад, поэтому я до сих пор использую 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. Скорость а. Предлагая проект системы структурированной базы данных и избегая перезаписи / поиска в огромной базе данных каждый раз, когда выполняется операция, делегирование данных папки-файла направлено на улучшение репутации быстродействия систем баз данных с плоскими файлами. я. Делегирование данных папок и файлов хранит данные с использованием папок и файлов, нет необходимости структурировать базу данных одного файла для систем баз данных с плоскими файлами, когда вы можете просто запросить запись по ее физическому пути, процесс запроса (поиск / обновление / удаление / sorting и т. д.) набор записей (таблица) дополнительно упрощается и расширяется за счет использования операторов запросов, которые по безопасности лучше, чем SQL. Скорость повышается за счет перезаписи небольшого файла, содержащего информацию об отдельной записи, вместо перезаписи всей базы данных. Делегирование данных папки-файла также хранит карты ключей, которые еще больше упрощают проверку новых входных данных. Кроме того, вы можете создавать порталы неограниченного доступа для своего приложения, когда один портал используется, новый файл портала будет клонирован, а операции будут создаваться одновременно, а не последовательно (предупреждение: это может привести к перегрузке ОЗУ, используйте на свой страх и риск и ограничьте количество порталов числом, соответствующим мощности вашего процессора). II. Заявление об отказе от ответственности: мы неявно заявляем, что делегирование данных из папки в файл является самой быстрой базой данных, скорее мы заявляем, что скорость эффективно повышается с использованием такого алгоритма.
  2. Согласованность а. Предлагая проект структурированной системы баз данных и проекты определенных компонентов, таких как коллекции, записи и поля, делегирование данных папок в файл направлено на улучшение согласованности систем баз данных с плоскими файлами. я. Делегирование данных папок и файлов организовывает данные таким образом, чтобы эффективно распределять их почти так же, как в реляционной базе данных.
  3. Базы данных - состоят из взаимосвязанных коллекций (папок)
  4. Коллекции - состоят из взаимосвязанных уникальных записей (папка)
  5. Записи - состоят из взаимосвязанных базовых единиц данных (папки)
  6. Поля - состоят из одной единицы данных (текст, символ, целое число, массив, объект) и имеют указанную длину для ускорения и безопасности запроса. (файл, который отображается (определяется) средством отображения полей коллекции)
  7. Безопасность а. Предлагая проект структурированной системы баз данных и NoSQL, а также строгую фильтрацию возможных атак на базу данных, делегирование данных папки-файла направлено на повышение безопасности систем баз данных с плоскими файлами. я. Делегирование данных папки-файла предлагает данные NoSQL, и все данные в запросе интерпретируются как данные, а не как команды. Таким образом, запрос - это просто доступ к физическому пути плюс операции передачи, и он должен выполняться на используемом языке программирования. Это похоже на то, как сервисная компания приходит к вам домой, предлагая вам услуги и прочее, а ваш дом - это определенная запись, которой манипулируют.
  8. Простота а. Предлагая черновой вариант структурированной системы, а также черновики задокументированных и черновых плановых презентаций концепций, делегирование данных папок в файл направлено на повышение безопасности систем баз данных с плоскими файлами. я. Делегирование данных папки и файла предлагает графический интерфейс, поэтому вам не нужно вручную выполнять операции и команды, если вы хотите изменить данные и т. Д. Операции также упрощаются благодаря взаимодействию с пользовательским интерфейсом.
  9. Гибкость а. Предлагая проект структурированной системы и абстрактно запланированные динамические обновления структуры базы данных, делегирование данных папки-файла направлено на повышение гибкости систем баз данных с плоскими файлами. я. Делегирование данных папки и файла регулярно обновляется и поддерживается, если ваша база данных подвергнется атаке со стороны определенного хакера, который может представлять угрозу и т. Д. Не беспокойтесь; ваша папка с базой данных хранится в скрытой папке (.folder).
person LeviJohn    schedule 22.03.2014