Создать мою собственную систему баз данных [закрыто]


65

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

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

Так как же мне заняться созданием этого? Какие ресурсы / учебники / книги я могу прочитать, чтобы понять?

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

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


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

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

9
I studied open-source DBs, but their codebase is too huge: Если что-то вроде redis или flockdb слишком велико для вас, я не понимаю, как вы справитесь с написанием или собственной базой данных.
Яннис

10
@YannisRizos Честно говоря, читать код (imo) гораздо сложнее, чем писать его самостоятельно.
AlexWebr

12
@Xananax: не слушайте лягушек ( crystal-reflections.com/stories/story_73.htm ). Делайте все, что вам нравится, и нет необходимости иметь цель получать удовольствие от процесса.

Ответы:


62

(он "ориентирован на узлы", если он вообще существует)

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

И поскольку то, что я имею в виду, не является ни реляционным, ни ориентированным на документы

Далее вы выбираете Relational или NoSQl. Если вы выбираете NoSQL, вы должны выбрать один тип NoSQL. Это чрезвычайно важно, вы не найдете никаких архитектурных документов, которые обсуждают все различные семейства баз данных. Неважно, какой вы выберете, просто выберите один и придерживайтесь его.

Язык не имеет значения ни в малейшей степени.

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

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

Несколько примеров, которые подходят:

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

Другим отличным вариантом было бы сконцентрироваться на создании движка для MySQL, как @NB предлагает в предыдущем ответе .

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

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

Какие ресурсы / учебники / книги я могу прочитать, чтобы понять?

Есть довольно много книг:

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

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


5
Это хороший пост
Chani

2
Это супер! Еще больше от тебя :) Я бы хотел принять почти друг от друга ответ, но так как я должен выбрать один, это должно быть. I'm expecting a comment with a link to your repository when you're done: Вероятнее всего! Еще раз спасибо вам и всем остальным, это было действительно воодушевляющим.
Ксананакс

3
И для тех, кто приезжает сюда и ищет те же ответы: я считаю, что flockDB - лучший кандидат для изучения, кодовая база действительно мала, код очень читабелен (хотя я не говорю на scala) и прост для понимания.
Ксананакс

@Yannis, кстати, какие из книг, которые вы рекомендуете, те, которые вы прочитали?
Pacerier

@Xananax Ооочень как дела? На какой репозиторий мы можем посмотреть? :)
Раду Мурзеа

27

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

Спрашивать других, если это хорошая идея, конечно, не очень хорошая стратегия . Если бы я выслушал всех лягушек, я бы все равно работал сегодня в Ikea, толкая тележку с парковки в депо.

Вам не нужно оправдываться, как Айенде в этом интересном посте . Вопрос был:

Однако, как прагматичный разработчик, мне интересно, что нового этот проект предлагает на насыщенном рынке, где у вас есть достаточно зрелые альтернативы, такие как CouchDB, MongoDB, Токио, Redis и многие другие? Многие из этих продуктов также являются кроссплатформенными и работают на скорости C с проверенной репутацией и используются на очень больших веб-сайтах, где их возможности шардинга и отказоустойчивость были значительно расширены.

Если вы получаете удовольствие от процесса, не беспокойтесь о цели, вы уже выиграли.


4
+1, очень вдумчивый и обучающий ответ :-) ... действительно хороший ответ тому, кто хочет что-то сделать
Pankaj Upadhyay

Очень мило на самом деле. Я был на грани принятия этого. Я не сделал, потому что я думал, что ответ Янниса был более точным, и более вероятно, чтобы помочь людям, имеющим тот же вопрос. Но это было определенно обнадеживающим. Большое спасибо.
Ксананакс

Ответ Яниса лучше моего и заслуживает вашего выбора

6

msgstr "(он" ориентирован на узлы ", если он вообще существует)". - Это может быть, почему вы не находите много!

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

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



4

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

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

Вот как бы я начал:

  1. Выберите ваш любимый язык или язык, который вы хотите улучшить.
  2. Создайте объект узла (или любой другой, наиболее близкий на вашем языке). Выясните, как их связать.
  3. Составьте короткий список операторов SQL, которые вы будете реализовывать в первую очередь.
  4. Решите, как сохранить данные. Одним из очевидных решений является сериализация всех узлов, загрузка их при запуске программы и сохранение их по завершении программы.

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


1
Я следую предложенным вами шагам. 1,2,3 не проблема. Тем не менее, я озадачен # 4. В случае больших объемов данных, как мне загрузить в память только соответствующие части? Я думал о том, чтобы сохранить все как двоичные данные и сохранить другой индексный файл, но что, если пользователь не запрашивает по индексу? Мне все еще придется просмотреть весь файл ... Наверное, пришло время для другого вопроса
Xananax

Почему бы просто не хранить все в памяти? Если вы выделите 1 ГБ, это будет содержать много данных. Поочередно сохраняйте каждый узел двоичных данных на диске, и тогда у вас будет 1 ГБ для текста. Это много текста. Во всяком случае, я думаю, что обработка базы данных размером более 1 ГБ не является центральной задачей.
B семь

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

3

Написание своей собственной базы данных «чтобы понять, как все это работает» - единственная причина, по которой это нужно сделать (поскольку базы данных сумасшедшие, трудно получить правильные и трудно доказать, что они правильные). Ты сумасшедший, но в хорошем смысле!

Чтобы увидеть, как это делается, предлагаю взглянуть на SQLite. Источник SQLite сжат только на 1,3 МБ и является полностью ACID-совместимой транзакционной базой данных. Это также общественное достояние, и главный автор - хороший парень, который, я уверен, будет рад ответить на ваши вопросы. (Я думаю, что самые хитрые моменты возникают в том, как правильно записать информацию на диск; убедить ОС и аппаратное обеспечение перестать лгать и действительно писать транзакцию СЕЙЧАС на удивление сложно, и поэтому я так рад, что мне никогда не придется писать БД.)


1
SQLite кодовая приближается к 0,2 * 10 ^ 6 LOC (5mb распакованный), это не что маленький.
Яннис

1
@Yannis: Сравните с MySQL или PostgreSQL или любой другой серверной базой данных…
Донал Феллоуз

3

Купить книгу:

http://www.springer.com/computer/database+management+%26+information+retrieval/book/978-1-84628-394-9

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

Также прочитайте о декартовом произведении, которое позволяет рассчитать, насколько сложными будут объединения.


3

Мне нужно узнать, как работают базы данных

Изучите реляционную алгебру.

Найдите небольшой движок БД, изучите источник.

для того, чтобы использовать их более эффективно

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

Следуйте традиционным маршрутам: пройдите курс, прочитайте книгу, рецензируйте, задайте вопросы, воспользуйтесь указателем Люка .


5
Learn relational algebra.Предполагая, что op заинтересован в реляционных базах данных, конечно ...
Яннис
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.