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


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

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

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

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

9 128

9 ответов:

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

http://sqlite.org/

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Удачи!

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