Cara menulis mesin basis data sederhana [tertutup]

143

Saya tertarik mempelajari cara kerja mesin basis data (yaitu bagian dalamnya). Saya tahu sebagian besar struktur data dasar yang diajarkan dalam CS (pohon, tabel hash, daftar, dll.) Serta pemahaman yang cukup baik tentang teori kompiler (dan telah menerapkan juru bahasa yang sangat sederhana) tetapi saya tidak mengerti bagaimana cara melakukannya tentang menulis mesin basis data. Saya telah mencari tutorial tentang masalah ini dan saya tidak dapat menemukannya, jadi saya berharap orang lain dapat mengarahkan saya ke arah yang benar. Pada dasarnya, saya ingin informasi tentang yang berikut:

  • Bagaimana data disimpan secara internal (yaitu bagaimana tabel diwakili, dll.)
  • Bagaimana mesin menemukan data yang dibutuhkan (mis. Jalankan kueri SELECT)
  • Bagaimana data dimasukkan dengan cara yang cepat dan efisien

Dan topik lain yang mungkin relevan dengan ini. Itu tidak harus menjadi basis data pada disk - bahkan basis data dalam memori baik-baik saja (jika lebih mudah) karena saya hanya ingin mempelajari prinsipal di belakangnya.

Terima kasih banyak atas bantuanmu.

a_m0d
sumber

Jawaban:

55

Jika Anda pandai membaca kode, mempelajari SQLite akan mengajarkan Anda seluruh muatan tentang desain basis data. Ini kecil, jadi lebih mudah untuk membungkus kepala Anda. Tetapi ini juga ditulis secara profesional.

http://sqlite.org/

Robert Harvey
sumber
2
LOC dari shelll.c = download 3135, sqlite3.c => 136332, sqlite3ext.h => 447, sqlite3.h => 7097, total => 147011
Khaja Minhajuddin
1
Yang mungkin sekecil Anda dapat membuat mesin basis data yang berfungsi penuh menggunakan bahasa kurawal. SQLite juga tersedia dalam C #.
Robert Harvey
1
@Ibrahim Najjar github.com/CsharpDatabase/csharp-sqlite
Robert Harvey
4
Saya merekomendasikan untuk membaca kode SQLite 2.5.0: github.com/davideuler/SQLite-2.5.0-for-code-reading , ini adalah versi awal SQLite yang dapat dikompilasi dan dijalankan pada GCC modern (saya sudah menguji di MacOS 10.13 dan Debian 8)
david euler
1
cstack.github.io/db_tutorial adalah titik awal yang baik.
Ashish Negi
25

Jawaban atas pertanyaan ini sangat besar. mengharapkan tesis PHD untuk menjawabnya 100%;) tetapi kita dapat memikirkan masalah satu per satu:

  • Cara menyimpan data secara internal: Anda harus memiliki file data yang berisi objek database Anda dan mekanisme caching untuk memuat data dalam fokus dan beberapa data di sekitarnya ke dalam RAM dengan asumsi Anda memiliki tabel, dengan beberapa data, kami akan membuat format data untuk mengubah tabel ini menjadi file biner, dengan menyetujui definisi pembatas kolom dan pembatas baris dan memastikan pola pembatas seperti itu tidak pernah digunakan dalam data Anda sendiri. yaitu jika Anda telah memilih <*> misalnya untuk memisahkan kolom, Anda harus memvalidasi data yang Anda tempatkan dalam tabel ini untuk tidak mengandung pola ini. Anda juga dapat menggunakan tajuk baris dan tajuk kolom dengan menentukan ukuran baris dan beberapa nomor pengindeksan internal untuk mempercepat pencarian Anda, dan pada awal setiap kolom memiliki panjang kolom ini seperti "Adam", 1, 11.1, "

  • Cara menemukan item dengan cepat mencoba menggunakan hashing dan pengindeksan untuk menunjuk pada data yang disimpan dan di-cache berdasarkan kriteria berbeda dengan mengambil contoh yang sama di atas, Anda bisa mengurutkan nilai kolom pertama dan menyimpannya di objek terpisah yang menunjuk pada baris id item yang diurutkan berdasarkan abjad. , dan seterusnya

  • Bagaimana mempercepat memasukkan data yang saya tahu dari Oracle adalah bahwa mereka memasukkan data di tempat sementara baik dalam RAM dan pada disk dan melakukan pembersihan secara berkala, mesin database sibuk sepanjang waktu mengoptimalkan strukturnya tetapi pada saat yang sama kita tidak ingin kehilangan data jika listrik padam seperti itu. jadi cobalah untuk menyimpan data di tempat sementara ini tanpa penyortiran, tambahkan penyimpanan asli Anda, dan nanti ketika sistem bebas menggunakan indeks Anda dan menghapus area temp ketika selesai

semoga sukses, proyek bagus.

A.Rashad
sumber
11

SQLite telah disebutkan sebelumnya, tetapi saya ingin menambahkan beberapa hal.

Saya pribadi belajar banyak dengan mempelajari SQlite. Yang menarik adalah, bahwa saya tidak pergi ke kode sumber (meskipun saya hanya melihat sekilas). Saya belajar banyak dengan membaca materi teknis dan secara khusus melihat perintah internal yang dihasilkannya. Ini memiliki interpreter berbasis stack sendiri di dalam dan Anda dapat membaca P-Code yang dihasilkannya secara internal hanya dengan menggunakan menjelaskan. Dengan demikian Anda dapat melihat bagaimana berbagai konstruksi diterjemahkan ke mesin tingkat rendah (yang ternyata sangat sederhana - tetapi itu juga merupakan rahasia stabilitas dan efisiensinya).

Juergen
sumber
11

Ada buku-buku dengan topik tempat yang baik untuk memulai adalah Sistem Basis Data: Buku Lengkap oleh Garcia-Molina, Ullman, dan Widom

djna
sumber
9

Oke, saya telah menemukan situs yang memiliki beberapa informasi tentang SQL dan implementasi - agak sulit untuk menautkan ke halaman yang mencantumkan semua tutorial, jadi saya akan menautkannya satu per satu:

a_m0d
sumber
8

Saya sarankan fokus pada www.sqlite.org

Ini baru-baru ini, kecil (kode sumber 1MB), open source (sehingga Anda dapat menemukannya sendiri) ...

Buku telah ditulis tentang bagaimana penerapannya:

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

Ini berjalan pada berbagai sistem operasi untuk komputer desktop dan ponsel sehingga bereksperimen itu mudah dan mempelajarinya akan berguna saat ini dan di masa depan.

Bahkan ada komunitas yang layak di sini: /programming/tagged/sqlite

michael aubert
sumber
1
Ukuran byte untuk 3.10 sekarang hampir 7,0 mb dari kode sumber. Hanya segelintir orang yang dapat mencerna semua itu dalam satu kesempatan. Namun demikian, ini juga merupakan tempat yang baik untuk memulai.
Laurie Stearn
1
Memang. Baru-baru ini menghabiskan beberapa waktu di dalam kode sumber SQLite untuk menemukan bug di SQLCipher, itu adalah mimpi buruk absolut. Hidup lebih sederhana 6 tahun yang lalu :-)
michael aubert
Hanya pertanyaan singkat ketika saya melewatkan pesta, saya kira akan jauh lebih santai (dan mungkin berguna) untuk memulai dari versi pertama? Sebenarnya saya harus melakukannya untuk semua pembacaan kode serius proyek besar?
Nicholas Humphrey
7

mungkin Anda bisa belajar dari HSQLDB . Saya pikir mereka menawarkan basis data kecil dan sederhana untuk pembelajaran. Anda dapat melihat kode karena ini adalah open source.

nightingale2k1
sumber
3

Saya tidak yakin apakah itu akan sesuai dengan kebutuhan Anda, tetapi saya telah mengimplementasikan database berorientasi file sederhana dengan dukungan untuk simple ( SELECT, INSERT , UPDATE) menggunakan perl.
Apa yang saya lakukan adalah saya menyimpan setiap tabel sebagai file pada disk dan entri dengan pola yang jelas dan memanipulasi data menggunakan alat linux yang dibangun seperti awk dan sed. untuk meningkatkan efisiensi, data yang sering diakses di-cache.

sud03r
sumber
1
apakah Anda masih memiliki kode, dapatkah Anda membagikan tautan
GK1
3

Jika MySQL menarik minat Anda, saya juga akan menyarankan halaman wiki ini , yang telah mendapat beberapa informasi tentang cara kerja MySQL. Juga, Anda mungkin ingin melihat Memahami MySQL Internal .

Anda mungkin juga mempertimbangkan untuk melihat antarmuka non-SQL untuk mesin Database Anda. Silakan lihat di Apache CouchDB . Apa yang Anda sebut, sistem database berorientasi dokumen.

Semoga berhasil!


sumber
Dan jika Anda ingin melihat db lain: sqlserverinternals.com, bukunya di internal server SQl adalah yang terbaik.
HLGEM