Buat sistem basis data saya sendiri [ditutup]

65

Saya perlu mempelajari cara kerja database agar dapat menggunakannya secara lebih efisien, dan cara belajar saya adalah dengan melakukannya.

Saya ingin membuat sistem basis data saya sendiri. Saya tidak bermaksud membuat pseudo-database yang akan menggunakan kueri untuk mengurai file; ini hanya akan menjadi antarmuka sistem file dengan bahasa permintaan. Saya berbicara tentang struktur aktual dari mesin basis data. Dan karena apa yang ada dalam pikiran saya bukanlah relasional atau berorientasi dokumen ("berorientasi simpul", jika itu ada), saya akan membutuhkan sumber daya apa saja untuk abstrak dan tingkat setinggi mungkin.

Jadi bagaimana cara saya membuat itu? Sumber daya / tutorial / buku apa yang dapat saya baca untuk mengerti?

Bahasa tidak menjadi masalah sedikitpun. Idealnya, kode tersebut adalah pseudo-code untuk menggambarkan konsep, tidak terikat pada bahasa tertentu, tetapi apa pun bisa dilakukan. Saya tidak dapat menemukan apa pun tentang masalah ini di google (karena saya sangat buta huruf pada subjek, mungkin saya tidak memasukkan pencarian yang tepat).

Jika sumber daya seperti itu tidak tersedia, maka saya kira sesuatu tentang cara membuat klien setidaknya akan menjadi langkah ke arah yang benar.

Xananax
sumber
15
Mengapa tidak menulis kompiler saja? Atau bahkan lebih baik, sistem operasi Anda sendiri? Jika Anda benar-benar serius menulis database Anda sendiri, ada seribu satu dan satu sumber database terbuka di luar sana: Pelajari kode sumber mereka, berkontribusi beberapa tambalan. Kemudian mulailah berpikir untuk membangun rumah Anda sendiri.
yannis
4
Anda dapat mengikuti kursus basis data tingkat perguruan tinggi dan pascasarjana. Ada banyak kursus open source online. Anda juga dapat membeli beberapa buku pelajaran dan mempelajarinya di waktu luang. Ini akan memberi Anda beberapa ide dan titik awal. Membaca sejarah dan berita tentang PostgreSQL juga akan membantu (dalam hal imajinasi, walaupun itu tidak akan memberi Anda ide bagaimana fitur-fitur tersebut benar-benar diimplementasikan)
rwong
9
I studied open-source DBs, but their codebase is too huge: Jika sesuatu seperti redis atau flockdb terlalu besar untuk Anda baca, saya tidak melihat bagaimana Anda akan mengatasi penulisan atau memiliki database.
yannis
10
@YannisRizos Secara adil, membaca kode (imo) jauh lebih sulit daripada menulisnya sendiri.
AlexWebr
12
@Xananax: jangan dengarkan katak ( crystal-reflections.com/stories/story_73.htm ). Lakukan apa pun yang Anda nikmati dan tidak perlu memiliki tujuan untuk menikmati prosesnya.

Jawaban:

61

(Ini "node-oriented", jika itu ada)

Mulai di sini. Ketika berhadapan dengan aplikasi yang kompleks seperti database (bahkan database sederhana adalah aplikasi yang kompleks), Anda harus terbiasa dengan sejarah domain dan terminologi yang tepat dan setidaknya memiliki ide arsitektur tingkat tinggi. Anda bisa mulai dari artikel Wikipedia tentang Basis Data . Menghabiskan beberapa hari membaca semua artikel tentang konsep terkait dan berbagai jenis database.

Dan karena apa yang ada dalam pikiran saya bukan relasional atau berorientasi dokumen

Selanjutnya, Anda memilih Relational atau NoSQl. Jika Anda memilih NoSQL, Anda harus memilih satu jenis NoSQL. Itu sangat penting, Anda tidak akan menemukan dokumen arsitektur yang membahas semua keluarga basis data yang berbeda. Tidak masalah yang mana yang Anda pilih, cukup pilih yang mana dan pilih saja.

Bahasa tidak menjadi masalah sedikitpun.

Ya ya (sayangnya), karena setelah Anda memilih keluarga basis data, Anda harus mulai mengeksplorasi kode dari basis data sumber terbuka dari keluarga itu. Ada beberapa pedoman umum tentang apa yang harus dicari:

  • Basis kode yang relatif kecil,
  • Dokumen arsitektur atau setidaknya blog pengembangan,
  • Basis data yang Anda pilih harus dekat dengan apa yang dianggap generik dalam keluarga, akan lebih sulit untuk dipelajari jika itu sangat terspesialisasi.

Beberapa contoh yang sesuai:

Dapatkan sumbernya, kompilasi dan mainkan. Anda tidak harus mengirimkan tambalan atau apa pun yang disukai, cukup jelajahi kodenya dan buat perubahan kecil di sana-sini untuk melihat apa yang terjadi. Ini adalah proses tambahan, semakin Anda bermain-main dengannya semakin mudah untuk memahami apa yang dilakukan kode. Jika proyek pertama yang Anda pilih tampaknya sangat sulit untuk dipahami, lanjutkan ke yang berikutnya.

Pilihan hebat lainnya adalah berkonsentrasi pada pembuatan mesin untuk MySQL, seperti yang disarankan @NB dalam jawaban sebelumnya .

Jika Anda mencapai titik di mana Anda dapat melakukan sesuatu yang berguna dengan basis kode, terlibat dalam komunitas proyek, itulah cara termudah untuk menemukan sumber daya yang lebih rinci tentang konsep-konsep yang terlibat.

Dan akhirnya, mulailah mengerjakan basis data Anda. Pada awalnya Anda hanya bisa menulis klon yang sangat diperkecil dari kode yang telah Anda jelajahi. Tidak harus asli, beberapa proyek besar dimulai sebagai klon atau garpu.

Sumber daya / tutorial / buku apa yang dapat saya baca untuk mengerti?

Ada beberapa buku:

Dan beberapa ratus lainnya, ditambah segudang makalah akademis yang dapat Anda lacak dengan mudah melalui Google. Anda perlu menentukan apa yang ingin Anda lakukan terlebih dahulu, dan kemudian mencari buku. Terlibat dengan komunitas sesama penulis basis data juga akan membantu Anda mempersempit daftar buku dan mungkin mendapatkan saran yang jauh lebih baik daripada yang di atas.

Semoga berhasil! Saya mengharapkan komentar dengan tautan ke repositori Anda setelah selesai. Dan jika Anda belum pernah selesai, pastikan Anda meninggalkan komentar yang mengingatkan saya bahwa saya masih belum menyelesaikan kompilator yang saya mulai tulis pada tahun 2001.

yannis
sumber
5
ini pos yang bagus
Chani
2
Ini super! Bahkan lebih banyak datang dari Anda :) Saya ingin menerima hampir setiap jawaban lain tetapi karena saya harus memilih satu ini harus menjadi itu. I'm expecting a comment with a link to your repository when you're done: pasti! Terima kasih sekali lagi, untuk Anda dan semua orang, ini benar-benar menggembirakan.
Xananax
3
Dan bagi siapa pun yang datang ke sini mencari jawaban yang sama: Saya menemukan flockDB menjadi kandidat terbaik untuk belajar, basis kode sangat kecil, kode sangat mudah dibaca (walaupun saya tidak berbicara scala) dan mudah dimengerti.
Xananax
@Yannis, Btw buku mana yang Anda rekomendasikan yang telah Anda baca?
Pacerier
@Xananax Sooo, bagaimana kabarnya? Repositori apa saja yang bisa kita lihat? :)
Radu Murzea
27

Anda harus melakukannya dan berhenti berpikir terlalu banyak. Menikmati proses belajar dan antusiasme adalah hadiah.

Bertanya kepada orang lain apakah itu ide yang bagus tentu bukan strategi yang baik . Jika saya mendengarkan semua katak, saya masih akan bekerja di Ikea hari ini mendorong kereta belanja dari parkir ke stasiun.

Anda tidak perlu membenarkan diri sendiri seperti yang dilakukan Ayende dalam posting yang menarik itu . Pertanyaannya adalah:

Namun sebagai pengembang pragmatis, saya bertanya-tanya apa yang ditawarkan proyek baru ini di pasar jenuh di mana Anda memiliki alternatif yang cukup matang seperti CouchDB, MongoDB, Tokyo, Redis, dan banyak lagi? Banyak dari produk ini juga lintas platform dan berjalan pada kecepatan C dengan catatan yang terbukti, sedang digunakan di situs web yang sangat besar di mana kemampuan sharding dan toleransi kesalahan mereka telah didorong jauh.

Jika Anda menikmati prosesnya, jangan khawatir tentang tujuannya, Anda sudah menang.


sumber
4
+1, jawaban yang sangat bijaksana dan mengajar :-) ... jawaban yang sangat bagus untuk seseorang yang ingin melakukan sesuatu
Pankaj Upadhyay
Memang sangat bagus. Saya hampir menerima hal ini. Saya tidak melakukannya karena saya pikir jawaban yannis lebih pada intinya, dan lebih cenderung membantu orang yang memiliki pertanyaan yang sama. Tapi ini jelas menggembirakan. Terima kasih banyak.
Xananax
Jawaban Yannis lebih baik dari pada milik saya dan pantas untuk pilihan Anda
6

"(" berorientasi simpul ", jika itu ada)". - Ini mungkin mengapa Anda tidak menemukan banyak!

Selami versi 0.1 dan lihat di mana Anda dapatkan. Anda dapat belajar lebih banyak dari mencoba menghasilkan apa yang Anda inginkan dari menanyakan apa yang "harus" Anda lakukan. Berikan beberapa hari lalu tinjau dari mana Anda mendapatkannya.

Sekitar 18 tahun yang lalu saya menulis sistem basis data dasar (untuk kesenangan, mencari angka) dengan indeks btree dan belajar banyak sekali.

Jaydee
sumber
4

MySQL memiliki struktur mesin penyimpanan pluggable, mungkin ide untuk memeriksa bagaimana mesin dibuat bekerja untuk MySQL.

Mjh
sumber
4

Kedengarannya seperti proyek yang hebat. Tampaknya tujuan Anda bukan untuk membuat perangkat lunak produksi, tetapi untuk mempelajari tentang basis data dan proses menciptakan sistem basis data.

Saya tidak berpikir Anda perlu melakukan banyak riset. Sepertinya tujuannya adalah untuk mendapatkan pengalaman tentang apa yang terjadi dalam menciptakan sistem basis data berbasis simpul.

Inilah cara saya memulai:

  1. Pilih bahasa favorit Anda atau bahasa yang ingin Anda tingkatkan.
  2. Buat objek simpul (atau apa pun yang terdekat dalam bahasa Anda). Cari tahu cara menautkannya.
  3. Buat daftar pendek pernyataan SQL yang akan Anda terapkan terlebih dahulu.
  4. Putuskan bagaimana cara menyimpan data. Salah satu solusi yang jelas adalah membuat cerita bersambung semua node, memuatnya saat program dimulai, dan menyimpannya saat program berakhir.

Setelah dasar-dasar ini berfungsi, Anda akan memiliki lebih banyak wawasan tentang apa yang sulit atau bermasalah. Kemudian Anda dapat melakukan riset tentang hal itu, menemukan beberapa perbaikan, dan mengintegrasikannya.

B Tujuh
sumber
1
Saya mengikuti langkah-langkah yang Anda sarankan. 1,2,3 tidak masalah. Namun, saya bingung dengan # 4. Dalam hal data dalam jumlah besar, bagaimana saya memuat dalam memori hanya bagian yang relevan? Saya berpikir untuk menyimpan semuanya sebagai data biner dan menyimpan file indeks lain, tetapi bagaimana jika pengguna tidak meminta berdasarkan indeks? Saya masih harus mengulang seluruh file ... Saya kira sudah waktunya untuk pertanyaan lain
Xananax
Mengapa tidak menyimpan saja semua dalam memori? Jika Anda mendedikasikan 1 GB, itu akan menampung banyak data. Sebagai alternatif, simpan setiap node data biner pada disk, dan Anda akan memiliki 1 GB untuk teks. Itu banyak teks. Ngomong-ngomong, saya pikir menangani basis data yang lebih besar dari 1GB bukanlah inti dari latihan.
B Seven
Selain itu, Anda dapat membuat banyak metode untuk bekerja secara efisien dalam memori 1 GB. Anda dapat meningkatkan bagian sistem itu nanti. Salah satu solusinya adalah memuat semua informasi node ke dalam memori, tetapi menyimpan data dari setiap node pada disk. Dengan begitu Anda dapat melintasi node secara efisien, dan hanya mengakses disk untuk mengambil data yang benar-benar Anda butuhkan.
B Seven
3

Menulis basis data Anda sendiri "untuk memahami cara kerjanya" adalah satu-satunya alasan bagus untuk melakukannya (karena basis data gila sulit dilakukan dengan benar, dan sulit dibuktikan dengan benar). Anda gila, tetapi dengan cara yang baik!

Untuk melihat bagaimana hal itu dilakukan, saya sarankan melihat SQLite. Sumber SQLite hanya sekitar 1.3MB terkompresi, dan ini merupakan basis data transaksional yang sepenuhnya sesuai ACID. Ini juga domain publik dan penulis utama adalah orang baik yang saya yakin akan dengan senang hati menjawab pertanyaan Anda. (Saya pikir bit paling sulit datang dalam cara untuk benar-benar melakukan informasi ke disk; membujuk OS dan perangkat keras untuk berhenti berbohong dan benar-benar menulis transaksi SEKARANG sangat sulit dan mengapa saya sangat senang saya tidak perlu menulis DB.)

Donal Fellows
sumber
1
Basis kode SQLite mendekati 0,2 * 10 ^ 6 loc (5mb didekompresi), tidak terlalu kecil.
yannis
1
@Yannis: Bandingkan dengan MySQL atau PostgreSQL atau sistem DB server lainnya ...
Donal Fellows
3

Saya perlu mempelajari cara kerja database

Pelajari aljabar relasional.

Temukan mesin DB kecil, pelajari sumbernya.

untuk menggunakannya lebih efisien

Nggak. Anda perlu belajar cara menggunakan database secara efisien. Anda mungkin menjadi pengemudi yang lebih baik jika Anda memahami cara mobil Anda bekerja, tetapi Anda akan menjadi pengemudi yang jauh lebih baik jika Anda benar-benar fokus pada mengemudi.

Ambil rute tradisional: ambil kursus, baca buku, peer review, ajukan pertanyaan, gunakan indeks luke .

Penyamaran
sumber
5
Learn relational algebra.Dengan asumsi op tertarik pada basis data relasional tentu saja ...
yannis