Как написать простой компонент database engine [закрыто]

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

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

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

большое спасибо за вашу помощь.

9 ответов


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

http://sqlite.org/


ответ на этот вопрос огромный. ожидайте, что кандидатская диссертация получит ответ 100% ;) но мы можем думать о проблемах по одному:

  • Как хранить данные внутри: у вас должен быть файл данных, содержащий объекты базы данных и механизм кэширования для загрузки данных в фокус и некоторых данных вокруг него в ОЗУ предположим, у вас есть таблица с некоторыми данными, мы создадим формат данных для преобразования этой таблицы в двоичный файл, договорившись о определение разделителя столбцов и разделителя строк и убедитесь, что такой шаблон разделителя никогда не используется в самих данных. т. е. если вы выбрали , например, для разделения столбцов, вы должны проверить данные, которые вы размещаете в этой таблице, чтобы не содержать этот шаблон. вы также можете использовать заголовок строки и заголовок столбца, указав размер строки и некоторый внутренний номер индексирования, чтобы ускорить поиск, и в начале каждого столбца иметь длину этого столбца например, "Адам", 1, 11.1, "123 АБВ-стрит, а / я 456" вы можете иметь его как Адам1111123 АБВ-стрит, а / я 456

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

  • Как ускорить вставку данных Я знаю от Oracle, что они вставляют данные во временное место как в ОЗУ, так и на диске и периодически ведут домашнее хозяйство, компонент database engine все время занят оптимизацией своей структуры, но в то же время мы не хотим терять данные в случае сбоя питания чего-то подобного. поэтому старайтесь хранить данные в этом временном месте без сортировки, добавляйте исходное хранилище и позже, когда система будет свободна, используйте свои индексы и очистить область temp, когда сделано

удачи, отличный проект.


есть книги на тему хорошее место для начала было бы Системы Баз Данных: Полная Книга Гарсия-Молина, Ульман, Уидом и


Я бы предложил сосредоточиться на www.sqlite.org

Это недавний, маленький (исходный код 1 МБ), с открытым исходным кодом (так что вы можете понять это сами)...

книги были написаны о том, как это реализовано:

http://www.sqlite.org/books.html

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

здесь даже есть приличное сообщество:https://stackoverflow.com/questions/tagged/sqlite


SQLite упоминалось ранее, но я хочу добавить кое-что.

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


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


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


Если MySQL вас интересует, я бы также предложил это страница wiki, который получил некоторую информацию о том, как работает MySQL. Кроме того, вы можете взглянуть на Понимание MySQL Internals.

вы также можете рассмотреть возможность просмотра интерфейса, отличного от SQL, для вашего компонента Database engine. Пожалуйста, взгляните на Apache CouchDB. Его то, что вы бы назвали, система базы данных, ориентированная на документ.

Удачи!


Я не уверен, что это будет соответствовать вашим требованиям, но я реализовал простую файловую базу данных с поддержкой simple (SELECT, INSERT , UPDATE) использование perl.
Я хранил каждую таблицу как файл на диске и записи с четко определенным шаблоном и манипулировал данными, используя встроенные инструменты linux, такие как awk и sed. для повышения эффективности данные, к которым часто обращаются, кэшируются.