วิธีเขียนโปรแกรมฐานข้อมูลอย่างง่าย [ปิด]


143

ฉันสนใจที่จะเรียนรู้ว่าเอ็นจิ้นฐานข้อมูลทำงานอย่างไร (เช่น internals ของมัน) ฉันรู้ว่าโครงสร้างข้อมูลพื้นฐานส่วนใหญ่สอนใน CS (ต้นไม้ตารางแฮชรายการ ฯลฯ ) รวมถึงความเข้าใจที่ดีเกี่ยวกับทฤษฎีคอมไพเลอร์ (และใช้ล่ามที่ง่ายมาก) แต่ฉันไม่เข้าใจว่าจะไปอย่างไร เกี่ยวกับการเขียนเอ็นจิ้นฐานข้อมูล ฉันได้ค้นหาบทช่วยสอนในเรื่องและฉันไม่สามารถหาได้ดังนั้นฉันหวังว่าจะมีคนอื่นชี้ให้ฉันในทิศทางที่ถูกต้อง โดยทั่วไปฉันต้องการข้อมูลเกี่ยวกับสิ่งต่อไปนี้:

  • วิธีจัดเก็บข้อมูลภายใน (เช่นวิธีแสดงตาราง ฯลฯ )
  • เครื่องมือค้นหาข้อมูลที่ต้องการได้อย่างไร (เช่นเรียกใช้แบบสอบถามแบบใช้เลือกข้อมูล)
  • วิธีการแทรกข้อมูลในวิธีที่รวดเร็วและมีประสิทธิภาพ

และหัวข้ออื่น ๆ ที่อาจเกี่ยวข้องกับเรื่องนี้ มันไม่จำเป็นต้องเป็นฐานข้อมูลบนดิสก์ - แม้แต่ฐานข้อมูลในหน่วยความจำก็ใช้ได้ (ถ้าทำได้ง่ายกว่า) เพราะฉันแค่ต้องการเรียนรู้หลักการที่อยู่เบื้องหลัง

ขอบคุณมากสำหรับความช่วยเหลือของคุณ.

คำตอบ:


55

หากคุณอ่านโค้ดได้ดีการเรียนรู้ SQLite จะสอนให้คุณเรียนรู้เกี่ยวกับการออกแบบฐานข้อมูลทั้งหมด มันมีขนาดเล็กดังนั้นจึงง่ายต่อการพันหัวของคุณ แต่มันก็เขียนอย่างมืออาชีพ

http://sqlite.org/


2
LOC ของ sqlite download shell.c => 3135, sqlite3.c => 136332, sqlite3ext.h => 447, sqlite3.h => 7097, ผลรวม => 147011
Khaja Minhajuddin

1
ซึ่งอาจมีขนาดเล็กมากเท่ากับคุณสามารถสร้างเอ็นจิ้นฐานข้อมูลที่ใช้งานได้อย่างสมบูรณ์โดยใช้ภาษาวงเล็บปีกกา SQLite ยังมีอยู่ใน C #
Robert Harvey


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เป็นจุดเริ่มต้นที่ดี
Ashish Negi

25

คำตอบสำหรับคำถามนี้เป็นคำถามที่ใหญ่มาก คาดหวังว่าวิทยานิพนธ์ปริญญาเอกจะให้คำตอบ 100%;) แต่เราสามารถคิดถึงปัญหาทีละคน:

  • วิธีการจัดเก็บข้อมูลภายใน: คุณควรมีไฟล์ข้อมูลที่มีวัตถุฐานข้อมูลของคุณและกลไกการแคชเพื่อโหลดข้อมูลที่อยู่ในโฟกัสและข้อมูลบางส่วนรอบ ๆ มันเป็น RAM สมมติว่าคุณมีตารางด้วยข้อมูลบางส่วนเราจะสร้างรูปแบบข้อมูล เพื่อแปลงตารางนี้เป็นไฟล์ไบนารีโดยยอมรับข้อกำหนดของตัวคั่นคอลัมน์และตัวคั่นแถวและตรวจสอบให้แน่ใจว่ารูปแบบของตัวคั่นดังกล่าวไม่เคยถูกใช้ในข้อมูลของคุณเอง เช่นถ้าคุณเลือก <*> เพื่อแยกคอลัมน์คุณควรตรวจสอบความถูกต้องของข้อมูลที่คุณวางในตารางนี้เพื่อไม่ให้มีรูปแบบนี้ คุณสามารถใช้ส่วนหัวของแถวและส่วนหัวคอลัมน์โดยระบุขนาดของแถวและหมายเลขดัชนีภายในเพื่อเพิ่มความเร็วในการค้นหาของคุณและในตอนเริ่มต้นของแต่ละคอลัมน์จะมีความยาวของคอลัมน์นี้เช่น "Adam", 1, 11.1, "

  • วิธีการค้นหารายการอย่างรวดเร็วลองใช้การแปลงแป้นพิมพ์และการจัดทำดัชนีชี้ไปที่ข้อมูลที่เก็บไว้และแคชตามเกณฑ์ที่แตกต่างกันโดยใช้ตัวอย่างเดียวกันข้างต้นคุณสามารถเรียงลำดับค่าของคอลัมน์แรกและเก็บไว้ในวัตถุแยกต่างหาก และอื่น ๆ

  • วิธีการเพิ่มความเร็วในการแทรกข้อมูลที่ฉันรู้จาก Oracle คือพวกเขาแทรกข้อมูลในสถานที่ชั่วคราวทั้งใน RAM และบนดิสก์และทำความสะอาดตามระยะเวลาเครื่องมือฐานข้อมูลไม่ว่างตลอดเวลาปรับโครงสร้างให้เหมาะสม แต่ในเวลาเดียวกันเราไม่ได้ ต้องการสูญเสียข้อมูลในกรณีที่ไฟฟ้าขัดข้องเช่นนั้น ดังนั้นพยายามเก็บข้อมูลไว้ในสถานที่ชั่วคราวนี้โดยไม่มีการเรียงลำดับผนวกที่เก็บข้อมูลดั้งเดิมของคุณและในภายหลังเมื่อระบบว่างดัชนีของคุณและล้างพื้นที่ temp เมื่อเสร็จสิ้น

โชคดีโครงการที่ดี


11

SQLite ถูกกล่าวถึงก่อนหน้านี้ แต่ฉันต้องการเพิ่มบางสิ่ง

ฉันเรียนรู้มากจากการเรียน SQlite สิ่งที่น่าสนใจคือฉันไม่ได้ไปที่ซอร์สโค้ด (แม้ว่าฉันเพิ่งจะดูสั้น ๆ ) ฉันได้เรียนรู้มากมายจากการอ่านเนื้อหาทางเทคนิคและดูคำสั่งภายในที่สร้างขึ้นเป็นพิเศษ มันมีล่ามแบบกองซ้อนอยู่ด้านในและคุณสามารถอ่าน P-Code ที่สร้างขึ้นภายในเพียงแค่ใช้อธิบาย ดังนั้นคุณสามารถดูว่าโครงสร้างต่าง ๆ ถูกแปลไปยังเอ็นจิ้นระดับต่ำได้อย่างไร (นั่นเป็นเรื่องที่เรียบง่ายอย่างน่าประหลาดใจ - แต่นั่นก็เป็นความลับของความมั่นคงและประสิทธิภาพของมัน)



9

โอเคฉันได้พบเว็บไซต์ที่มีข้อมูลบางอย่างเกี่ยวกับ SQL และการนำไปใช้งาน - มันเป็นการยากที่จะเชื่อมโยงไปยังหน้าซึ่งแสดงรายการบทเรียนทั้งหมดดังนั้นฉันจะเชื่อมโยงพวกเขาทีละคน:


8

ฉันขอแนะนำให้มุ่งเน้นไปที่ www.sqlite.org

มันเป็นขนาดเล็กเมื่อเร็ว ๆ นี้ (ซอร์สโค้ด 1MB), โอเพ่นซอร์ส (เพื่อให้คุณสามารถคิดออกเอง)

มีการเขียนหนังสือเกี่ยวกับวิธีการนำไปใช้งาน:

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

มันทำงานบนระบบปฏิบัติการที่หลากหลายสำหรับคอมพิวเตอร์เดสก์ท็อปและโทรศัพท์มือถือดังนั้นการทดลองทำได้ง่ายและการเรียนรู้เกี่ยวกับมันจะมีประโยชน์ทั้งในปัจจุบันและอนาคต

มันมีชุมชนที่เหมาะสมที่นี่: /programming/tagged/sqlite


1
ขนาดไบต์สำหรับ 3.10 ตอนนี้เกือบ 7.0 mb ของรหัสที่มา มีคนเพียงไม่กี่คนที่มีสิทธิพิเศษเท่านั้นที่สามารถย่อยทุกอย่างในที่เดียว อย่างไรก็ตามนี่เป็นจุดเริ่มต้นที่ดี
ลอรีสเติร์น

1
จริง เมื่อไม่นานมานี้ได้ใช้เวลาภายในซอร์สโค้ดของ SQLite เพื่อหาจุดบกพร่องใน SQLCipher มันเป็นฝันร้ายที่แท้จริง ชีวิตเรียบง่ายขึ้นเมื่อ 6 ปีก่อน :-)
michael aubert

แค่คำถามสั้น ๆ เมื่อฉันคิดถึงปาร์ตี้ฉันคิดว่ามันน่าจะผ่อนคลายกว่า (และอาจมีประโยชน์) มากกว่าที่จะเริ่มจากเวอร์ชั่นแรก? ที่จริงฉันควรทำเช่นนั้นสำหรับการอ่านโค้ดที่จริงจังของโปรเจคใหญ่ ๆ ทั้งหมดหรือไม่?
นิโคลัสฮัมฟรีย์

7

อาจจะเป็นที่คุณสามารถเรียนรู้จากHSQLDB ฉันคิดว่าพวกเขามีฐานข้อมูลขนาดเล็กและเรียบง่ายสำหรับการเรียนรู้ คุณสามารถดูรหัสได้เนื่องจากเป็นโอเพ่นซอร์ส


3

ฉันไม่แน่ใจว่าจะเหมาะกับความต้องการของคุณหรือไม่ แต่ฉันได้ใช้ฐานข้อมูลไฟล์แบบง่ายพร้อมการสนับสนุน simple ( SELECT, INSERT , UPDATE) โดยใช้ Perl
สิ่งที่ฉันทำคือฉันจัดเก็บแต่ละตารางเป็นไฟล์บนดิสก์และรายการที่มีรูปแบบที่กำหนดไว้อย่างดีและจัดการข้อมูลโดยใช้เครื่องมือ linux ในตัวเช่น awk และ sed สำหรับการปรับปรุงประสิทธิภาพแคชข้อมูลที่เข้าถึงบ่อยถูกแคช


1
คุณยังมีรหัสคุณสามารถแชร์ลิงก์ได้ไหม
GK1

3

ถ้า MySQL สนใจคุณฉันจะแนะนำหน้าวิกินี้ซึ่งมีข้อมูลบางอย่างเกี่ยวกับวิธีการทำงานของ MySQL นอกจากนี้คุณอาจต้องการที่จะดูที่การทำความเข้าใจ MySQL Internals

คุณอาจพิจารณาดูอินเตอร์เฟสที่ไม่ใช่ SQL สำหรับเอ็นจินฐานข้อมูลของคุณ โปรดดูที่Apache CouchDB มันคือสิ่งที่คุณจะเรียกว่าระบบฐานข้อมูลเอกสารที่มุ่งเน้น

โชคดี!


และถ้าคุณต้องการดูอีก db: sqlserverinternals.com nbooks ของเธอใน internals เซิร์ฟเวอร์ SQl เป็น top-nitch
HLGEM
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.