Як написати простий двигун бази даних [закрито]


143

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

  • Як дані зберігаються всередині (тобто як представлені таблиці тощо)
  • Як двигун знаходить потрібні йому дані (наприклад, запустіть SELECT-запит)
  • Як вставляти дані швидким та ефективним способом

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

Велике спасибі за вашу допомогу.

Відповіді:


55

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

http://sqlite.org/


2
LOC sqlite завантажити shell.c => 3135, sqlite3.c => 136332, sqlite3ext.h => 447, sqlite3.h => 7097, всього => 147011
Khaja

1
Це, мабуть, приблизно так мало, як ви можете зробити повністю функціональний механізм бази даних, використовуючи фігурну мову дужок. SQLite також доступний у C #.
Роберт Харві


4
Я рекомендую прочитати код SQLite 2.5.0: github.com/davideuler/SQLite-2.5.0-for-code-reading , це рання версія SQLite, яку можна компілювати та працювати на сучасних GCC (я тестував це на MacOS 10.13 та Debian 8)
David Euler

1
cstack.github.io/db_tutorial - хороша відправна точка.
Ashish Negi

25

Відповідь на це питання величезна. очікуємо, що теза PHD відповість на 100%;) але ми можемо думати про проблеми одна за одною:

  • Як внутрішньо зберігати дані: у вас повинен бути файл даних, що містить об’єкти бази даних, і механізм кешування для завантаження даних у фокусі, а деякі дані навколо них в оперативну пам'ять, припускають, що у вас є таблиця, з деякими даними, ми створили б формат даних конвертувати цю таблицю у двійковий файл, домовившись про визначення роздільника стовпців та роздільника рядків та переконайтесь, що така схема роздільника ніколи не використовується у ваших даних. тобто якщо ви вибрали <*>, наприклад, для розділення стовпців, слід перевірити дані, які ви розміщуєте в цій таблиці, щоб не містити цього шаблону. ви також можете використовувати заголовок рядка та заголовок стовпця, вказавши розмір рядка та деякий внутрішній номер індексації для прискорення пошуку, а на початку кожного стовпця мати довжину цього стовпця, наприклад "Адам", 1, 11.1, "

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

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

удачі, чудового проекту.


11

Про SQLite згадувалося раніше, але я хочу додати щось.

Я особисто багато чому навчився, вивчаючи SQlite. Цікавим є те, що я не зайшов до вихідного коду (хоча я просто короткий огляд). Я багато чого навчився, читаючи технічний матеріал і спеціально переглядаючи внутрішні команди, які він створює. У ньому є власний інтерпретатор на основі стека, і ви можете читати P-код, який він генерує всередині, лише використовуючи пояснення. Таким чином, ви можете бачити, як різні конструкції переводяться на двигун низького рівня (що дивно просто - але в цьому також секрет його стабільності та ефективності).



9

Гаразд, я знайшов сайт, який містить деяку інформацію про SQL та реалізацію - трохи важко посилатись на сторінку, на якій перераховані всі підручники, тому я пов'язую їх по черзі:


8

Я б запропонував зосередитись на www.sqlite.org

Це нещодавній невеликий (вихідний код 1МБ) з відкритим кодом (щоб ви могли це зрозуміти для себе) ...

Про те, як це реалізується, написано книги:

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

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

Тут навіть є гідне співтовариство: /programming/tagged/sqlite


1
Розмір байта для 3,10 зараз становить майже 7,0 мб вихідного коду. Лише нечисленні приватні особи могли переварити все це за один прийом. Тим не менш, це також гарне місце для початку.
Лорі Стерн

1
Справді. Нещодавно провів деякий час всередині вихідного коду SQLite, щоб знайти помилку в SQLCipher, це абсолютний кошмар. Життя було простішим 6 років тому :-)
michael aubert

Просто швидке запитання, як я пропустив вечірку, я думаю, що було б набагато більш розслаблюючою (і, можливо, корисною) почати з першої версії? Насправді я повинен зробити це для всіх серйозних читання кодів великих проектів?
Ніколас Хамфрі

7

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


3

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


1
у вас ще є код, можете поділитися посиланням
GK1,

3

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

Ви можете також розглянути не-SQL-інтерфейс для вашого двигуна баз даних. Погляньте, будь ласка, на Apache CouchDB . Це, як ви б назвали, система бази даних, орієнтована на документи.

Щасти!


І якщо ви хочете подивитися на інший db: sqlserverinternals.com, її nbooks на внутрішніх серверах SQl - це найвищий показник.
HLGEM
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.