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


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 ). Робіть все, що вам подобається, і не потрібно мати мета, щоб отримувати задоволення від цього процесу.

Відповіді:


61

(це "орієнтоване на вузол", якщо таке взагалі існує)

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

А оскільки те, що я маю на увазі, не є ні реляційним, ні документоорієнтованим

Далі ви вибираєте 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: найбільш точно! Ще раз дякую вам і всім іншим, це було справді піднесеним.
Xananax

3
А для тих, хто приїжджає сюди, шукаючи однакових відповідей: я вважаю flockDB найкращим кандидатом на навчання, кодова база дійсно невелика, код дуже читабельний (хоча я не розмовляю зі шкалою) та легкий для розуміння.
Xananax

@Yannis, Btw, яку із рекомендованих книг ти перечитав?
Pacerier

@Xananax Sooo, як це відбувається? Будь-яке сховище, яке ми можемо переглянути? :)
Radu Murzea

27

Вам слід просто зробити це і перестати думати занадто багато. Насолоджуючись навчальним процесом та ентузіазмом - це подарунки.

Запитувати інших, чи це гарна ідея, звичайно, не є хорошою стратегією . Якби я вислухав усіх жаб, я б все-таки працював у Ikea сьогодні, відсуваючи кошик з парковки до депо.

Вам не доведеться виправдовувати себе, як Ейнде робив цю цікаву посаду . Питання:

Однак, як прагматичного розробника, мені цікаво, що нового пропонує цей проект на насиченому ринку, де у вас є досить зрілі альтернативи, як CouchDB, MongoDB, Tokyo, Redis та багато іншого? Багато з цих продуктів також є крос-платформованими та працюють зі швидкістю С із перевіреним записом, використовуючи їх на дуже великих веб-сайтах, де їхні можливості загострення та відмовостійкість були просунуті далеко.

Якщо ви насолоджуєтесь процесом, не переживайте за мету, ви вже виграли.


4
+1, дуже вдумливий та викладацький відповідь :-) ... дуже приємна відповідь тому, хто хоче щось робити
Панкай Упадхей

Справді дуже приємно. Я був на межі прийняти це. Я цього не зробив, бо вважав, що відповідь Янніс буде більш зрозумілим, і швидше за все, щоб допомогти людям, які мають те саме питання. Але це було безумовно обнадійливим. Дуже дякую.
Xananax

Відповідь Яніса краща за мою і заслуговує вашого вибору

6

"(це" орієнтоване на вузол ", якщо таке навіть існує)". - Це може бути, чому ви не знаходите багато!

Занурись у версію 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 або будь-якою з інших систем DB-сервера…
Donal Fellows

3

Придбайте книгу:

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

Індекси - це найважливіший аспект баз даних сьогодні. Вивчіть альтернативи, які існують, як бінарні дерева.

Читайте також про декартовий продукт, який є способом обчислити складність приєднання.


3

Мені потрібно дізнатися, як працюють бази даних

Вивчіть реляційну алгебру.

Знайдіть невеликий двигун БД, дізнайтеся джерело.

щоб ефективніше їх використовувати

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

Пройдіться традиційними маршрутами: пройдіть курс, прочитайте книгу, проведіть рецензію, задайте питання, використовуйте індекс luke .


5
Learn relational algebra.Припустимо, що op зацікавлені в реляційних базах даних, звичайно, ...
yannis
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.