कैसे एक साधारण डेटाबेस इंजन लिखने के लिए [बंद]


143

मैं यह जानने में दिलचस्पी रखता हूं कि एक डेटाबेस इंजन कैसे काम करता है (अर्थात इसके आंतरिक भाग)। मुझे पता है कि CS (ट्री, हैश टेबल, लिस्ट, आदि) में सिखाई गई अधिकांश बुनियादी डेटा संरचनाएं और साथ ही संकलक सिद्धांत की बहुत अच्छी समझ है (और एक बहुत ही सरल व्याख्याकार को लागू किया है), लेकिन मुझे समझ नहीं आता कि कैसे जाना है डेटाबेस इंजन लिखने के बारे में। मैंने इस विषय पर ट्यूटोरियल खोजे हैं और मुझे कोई नहीं मिल रहा है, इसलिए मुझे उम्मीद है कि कोई और मुझे सही दिशा में ले जा सकता है। मूल रूप से, मुझे निम्नलिखित पर जानकारी चाहिए:

  • डेटा को आंतरिक रूप से कैसे संग्रहीत किया जाता है (अर्थात तालिकाओं का प्रतिनिधित्व कैसे किया जाता है, आदि)
  • इंजन को वह डेटा कैसे मिलता है जिसकी उसे आवश्यकता होती है (उदाहरण के लिए एक चयन क्वेरी चलाएँ)
  • कैसे तेजी और कुशल तरीके से डेटा डाला जाता है

और कोई अन्य विषय जो इसके लिए प्रासंगिक हो सकता है। यह ऑन-डिस्क डेटाबेस होना जरूरी नहीं है - यहां तक ​​कि इन-मेमोरी डेटाबेस भी ठीक है (यदि यह आसान है), क्योंकि मैं इसके पीछे प्रिंसिपल सीखना चाहता हूं।

आपकी मदद के लिए बहुत धन्यवाद।

जवाबों:


55

यदि आप कोड पढ़ने में अच्छे हैं, तो SQLite का अध्ययन आपको डेटाबेस डिज़ाइन के बारे में संपूर्ण जानकारी प्रदान करेगा। यह छोटा है, इसलिए अपने सिर को चारों ओर लपेटना आसान है। लेकिन यह भी पेशेवर रूप से लिखा गया है।

http://sqlite.org/


2
SQLite डाउनलोड shell.c की एलओसी => 3135, sqlite3.c => 136,332, sqlite3ext.h => 447, sqlite3.h => 7097, कुल => 147,011
Khaja Minhajuddin

1
जो शायद उतना ही छोटा है जितना कि आप घुंघराले ब्रेस भाषा का उपयोग करके पूरी तरह कार्यात्मक डेटाबेस इंजन बना सकते हैं। SQLite C # में भी उपलब्ध है।
रॉबर्ट हार्वे


4
मैं SQLite 2.5.0 का कोड पढ़ने की सलाह देता हूं: github.com/davideuler/SQLite-2.5.0-for-code-reading , यह SQLite का प्रारंभिक संस्करण है जिसे संकलित किया जा सकता है और आधुनिक GCC पर चलाया जा सकता है (मैंने परीक्षण किया है) यह MacOS 10.13 और डेबियन 8 पर
दाविद शासक

1
cstack.github.io/db_tutorial अच्छा शुरुआती बिंदु है।
आशीष नेगी

25

इस सवाल का जवाब बहुत बड़ा है। PHD थीसिस की उम्मीद है कि इसका उत्तर 100% है;) लेकिन हम एक-एक करके समस्याओं के बारे में सोच सकते हैं:

  • डेटा को आंतरिक रूप से कैसे संग्रहीत करें: आपके पास डेटा फ़ाइल होनी चाहिए जिसमें आपके डेटाबेस ऑब्जेक्ट और कैशिंग तंत्र डेटा को फोकस में लोड करने के लिए हो और इसके आस-पास कुछ डेटा रैम में मान लें कि आपके पास एक तालिका है, कुछ डेटा के साथ, हम एक डेटा प्रारूप बनाएंगे एक स्तंभ सीमांकक और एक पंक्ति सीमांकक की परिभाषा पर सहमत होकर और इस तालिका को द्विआधारी फ़ाइल में परिवर्तित करने के लिए सुनिश्चित करें कि आपके डेटा में इस तरह के परिसीमन का उपयोग कभी नहीं किया जाता है। उदाहरण के लिए, यदि आपने कॉलम को अलग करने के लिए <*> का चयन किया है, तो आपको इस तालिका में मौजूद डेटा को मान्य करना चाहिए जिसमें यह पैटर्न नहीं है। आप अपनी खोज को गति देने के लिए पंक्ति और कुछ आंतरिक अनुक्रमण संख्या के आकार को निर्दिष्ट करके एक पंक्ति शीर्ष लेख और एक स्तंभ शीर्षलेख का उपयोग भी कर सकते हैं, और प्रत्येक स्तंभ के प्रारंभ में इस स्तंभ की लंबाई "एडम", 1, 11.1, "

  • आइटमों को खोजने के लिए जल्दी से हैशिंग और इंडेक्सिंग का उपयोग करने की कोशिश करें और ऊपर दिए गए समान मानदंड के आधार पर संग्रहीत और कैश किए गए डेटा पर इंगित करने के लिए, आप पहले कॉलम के मूल्य को सॉर्ट कर सकते हैं और इसे अलग-अलग ऑब्जेक्ट में पंक्तिबद्ध करके वस्तुओं की पंक्ति आईडी की ओर इशारा करते हुए सॉर्ट कर सकते हैं , और इसी तरह

  • Oracle से मुझे पता है कि डेटा को कैसे गति दें, वे एक अस्थायी जगह में रैम और डिस्क दोनों में डेटा डालते हैं और आवधिक आधार पर हाउसकीपिंग करते हैं, डेटाबेस इंजन हर समय इसकी संरचना का अनुकूलन करने में व्यस्त रहता है, लेकिन एक ही समय में हम नहीं करते हैं ऐसा कुछ होने की शक्ति की विफलता के मामले में डेटा खोना चाहते हैं। इसलिए बिना किसी छँटाई के साथ इस अस्थायी जगह में डेटा रखने की कोशिश करें, अपने मूल भंडारण को संलग्न करें, और बाद में जब सिस्टम मुफ़्त है तो अपने अनुक्रमित का सहारा लें और जब किया जाए तब अस्थायी क्षेत्र को साफ़ करें

सौभाग्य, महान परियोजना।


11

SQLite का उल्लेख पहले किया गया था, लेकिन मैं कुछ बात जोड़ना चाहता हूं।

मैंने व्यक्तिगत रूप से SQlite का अध्ययन करके बहुत कुछ सीखा है। दिलचस्प बात यह है, कि मैं सोर्स कोड में नहीं गया था (हालाँकि मुझे सिर्फ एक छोटा सा लुक था)। मैंने तकनीकी सामग्री को पढ़कर बहुत कुछ सीखा और विशेष रूप से आंतरिक कमांडों को देखकर यह उत्पन्न करता है। इसके अंदर खुद का स्टैक आधारित दुभाषिया है और आप पी-कोड को पढ़ सकते हैं यह केवल व्याख्या का उपयोग करके आंतरिक रूप से उत्पन्न करता है। इस प्रकार आप देख सकते हैं कि विभिन्न निर्माण निम्न-स्तरीय इंजन में कैसे अनुवादित किए जाते हैं (जो आश्चर्यजनक रूप से सरल है - लेकिन यही इसकी स्थिरता और दक्षता का रहस्य भी है)।



9

ठीक है, मुझे एक साइट मिली है जिसमें एसक्यूएल और कार्यान्वयन के बारे में कुछ जानकारी है - यह उस पेज से लिंक करना थोड़ा कठिन है जो सभी ट्यूटोरियल को सूचीबद्ध करता है, इसलिए मैं उन्हें एक-एक करके लिंक करूंगा:


8

मैं www.sqlite.org पर ध्यान केंद्रित करने का सुझाव दूंगा

यह हाल ही में, छोटा (स्रोत कोड 1 एमबी), खुला स्रोत है (ताकि आप इसे अपने लिए समझ सकें) ...

इसे कैसे लागू किया जाता है, इस बारे में किताबें लिखी गई हैं:

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

यह डेस्कटॉप कंप्यूटर और मोबाइल फोन दोनों के लिए विभिन्न प्रकार के ऑपरेटिंग सिस्टम पर चलता है इसलिए प्रयोग करना आसान है और इसके बारे में सीखना अभी और भविष्य में उपयोगी होगा।

यहाँ भी एक सभ्य समुदाय है: /programming/tagged/sqlite


1
3.10 के लिए बाइट का आकार अब लगभग स्रोत कोड का 7.0 mb है। केवल एक निजीकरण कुछ ही में बैठे सभी को पचा सकता है। फिर भी, यह भी शुरू करने के लिए एक अच्छी जगह है।
लॉरी स्टर्न

1
वास्तव में। SQLCipher में बग ढूंढने के लिए SQLite के स्रोत कोड के अंदर हाल ही में कुछ समय बिताने के बाद, यह एक निरपेक्ष दुःस्वप्न है। 6 साल पहले जीवन सरल था :-)
माइकल ऐबर्ट

बस एक त्वरित सवाल जैसा कि मैंने पार्टी को याद किया, मुझे लगता है कि यह पहले संस्करण से शुरू करने के लिए बहुत अधिक आराम (और शायद उपयोगी) होगा? वास्तव में मुझे बड़ी परियोजनाओं के सभी गंभीर कोड पढ़ने के लिए ऐसा करना चाहिए?
निकोलस हम्फ्रे

7

हो सकता है कि आप HSQLDB से सीख सकें । मुझे लगता है कि वे सीखने के लिए छोटा और सरल डेटाबेस प्रदान करते हैं। आप कोड को देख सकते हैं क्योंकि यह खुला स्रोत है।


3

मुझे यकीन नहीं है कि यह आपकी आवश्यकताओं के अनुरूप होगा या नहीं, लेकिन मैंने SELECT, INSERT , UPDATEपर्ल के उपयोग से सरल ( ) के लिए समर्थन के साथ एक साधारण फ़ाइल उन्मुख डेटाबेस लागू किया था ।
मैंने जो कुछ किया था, उसे डिस्क पर एक फ़ाइल के रूप में प्रत्येक तालिका में संग्रहीत किया गया था और एक अच्छी तरह से परिभाषित पैटर्न के साथ प्रविष्टियां और अंतर्निहित लिनक्स उपकरण जैसे कि अज़ और सेड का उपयोग करके डेटा में हेरफेर किया था। दक्षता में सुधार के लिए, अक्सर एक्सेस किए गए डेटा को कैश किया गया था।


1
क्या आपके पास अभी भी कोड है, आप एक लिंक साझा कर सकते हैं
GK1

3

यदि MySQL आपकी रुचि रखता है, तो मैं इस विकी पेज का भी सुझाव दूंगा , जिसमें MySQL कैसे काम करता है, इसके बारे में कुछ जानकारी मिली है। इसके अलावा, आप MySQL इंटरनल्स को समझना चाहते हैं ।

आप अपने डेटाबेस इंजन के लिए गैर-SQL इंटरफ़ेस देखने पर भी विचार कर सकते हैं। कृपया Apache CouchDB पर एक नज़र डालें । इसकी जिसे आप कहेंगे, एक दस्तावेज उन्मुख डेटाबेस प्रणाली।

शुभ लाभ!


एएनडी अगर आप एक और डीबी देखना चाहते हैं: sqlserverinternals.com SQl सर्वर इंटर्नल पर उसकी nbooks शीर्ष-कुतिया हैं।
HLGEM
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.