สร้างระบบฐานข้อมูลของฉันเอง [ปิด]


65

ฉันต้องการเรียนรู้วิธีการทำงานของฐานข้อมูลเพื่อใช้งานได้อย่างมีประสิทธิภาพมากขึ้นและวิธีการเรียนรู้ของฉันก็คือการทำ

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

ดังนั้นฉันจะไปเกี่ยวกับการสร้างที่ได้อย่างไร ฉันสามารถอ่านทรัพยากร / บทช่วยสอน / หนังสือใดให้เข้าใจ

ภาษาไม่สำคัญเลยแม้แต่น้อย ตามหลักการแล้วรหัสนั้นจะเป็นรหัสเทียมเพื่อแสดงแนวคิดไม่ผูกติดกับภาษาใดภาษาหนึ่ง แต่จะทำทุกอย่าง ฉันไม่สามารถพบสิ่งใดในเรื่องบน google (เนื่องจากฉันไม่รู้หนังสือในเรื่องนี้บางทีฉันอาจไม่ได้เข้าสู่การค้นหาที่ถูกต้อง)

หากทรัพยากรดังกล่าวไม่พร้อมใช้งานฉันคาดเดาบางอย่างเกี่ยวกับวิธีการสร้างลูกค้าอย่างน้อยก็จะเป็นขั้นตอนในทิศทางที่ถูกต้อง


15
ทำไมไม่เขียนคอมไพเลอร์แทนล่ะ? หรือดีกว่านั้นคือระบบปฏิบัติการของคุณเอง? หากคุณจริงจังกับการเขียนฐานข้อมูลของคุณจริงๆมีฐานข้อมูลโอเพ่นซอร์สหนึ่งพันฐานข้อมูลอยู่ที่นั่น: ศึกษาซอร์สโค้ดของพวกเขาสนับสนุนแพตช์เล็ก ๆ น้อย ๆ จากนั้นเริ่มคิดถึงการสร้างของคุณเอง
yannis

4
คุณสามารถเรียนหลักสูตรฐานข้อมูลระดับวิทยาลัยและระดับบัณฑิตศึกษาได้ มีหลักสูตรโอเพนซอร์ซมากมายออนไลน์ คุณยังสามารถซื้อหนังสือเรียนสองสามเล่มและศึกษาในเวลาว่าง นี่จะให้แนวคิดและจุดเริ่มต้นกับคุณ อ่านหนังสือประวัติศาสตร์และข่าวเกี่ยวกับ PostgreSQL ยังจะช่วยให้ (ในแง่ของจินตนาการถึงแม้ว่ามันจะไม่ให้ความคิดว่าคุณสมบัติเหล่านั้นจะถูกนำมาใช้จริง)
rwong

9
I studied open-source DBs, but their codebase is too huge: ถ้าบางอย่างเช่นredisหรือflockdbมีขนาดใหญ่เกินกว่าที่คุณจะอ่านฉันไม่เห็นว่าคุณจะรับมือกับการเขียนหรือฐานข้อมูลของตัวเองได้อย่างไร
yannis

10
@YannisRizos ในความเป็นธรรมการอ่านโค้ด (imo) นั้นยากกว่าการเขียนด้วยตัวเอง
AlexWebr

12
@Xananax: อย่าฟังกบ ( crystal-reflections.com/stories/story_73.htm ) ทำในสิ่งที่คุณชอบและไม่จำเป็นต้องมีวัตถุประสงค์เพื่อความเพลิดเพลินในกระบวนการ

คำตอบ:


61

(เป็น "โหนดที่มุ่งเน้น" หากยังมีอยู่)

เริ่มที่นี่. เมื่อจัดการกับแอปพลิเคชันที่ซับซ้อนเช่นฐานข้อมูล (แม้แต่ฐานข้อมูลอย่างง่ายก็คือแอปพลิเคชันที่ซับซ้อน) คุณควรทำความคุ้นเคยกับประวัติของโดเมนและคำศัพท์ที่เหมาะสมและมีแนวคิดสถาปัตยกรรมระดับสูงอย่างน้อย คุณสามารถเริ่มต้นจากบทความวิกิพีเดียในฐานข้อมูล ใช้เวลาสองสามวันในการอ่านบทความทั้งหมดเกี่ยวกับแนวคิดที่เกี่ยวข้องและประเภทฐานข้อมูลที่แตกต่างกัน

และเนื่องจากสิ่งที่ฉันมีอยู่ในใจไม่ได้เป็นเชิงสัมพันธ์หรือเชิงเอกสาร

ถัดไปคุณเลือก Relational หรือ NoSQl หากคุณเลือก NoSQL คุณควรเลือก NoSQL หนึ่งประเภท นั่นเป็นสิ่งสำคัญอย่างยิ่งคุณจะไม่พบเอกสารสถาปัตยกรรมใด ๆ ที่กล่าวถึงตระกูลฐานข้อมูลที่แตกต่างกันทั้งหมด มันไม่สำคัญว่าคุณจะเลือกคนไหนแค่เลือกอันไหนแล้วติดมัน

ภาษาไม่สำคัญเลยแม้แต่น้อย

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

  • codebase ค่อนข้างเล็ก
  • เอกสารทางสถาปัตยกรรมหรือบล็อกการพัฒนาอย่างน้อย
  • ฐานข้อมูลที่คุณเลือกควรอยู่ใกล้กับสิ่งที่ถือว่าเป็นเรื่องทั่วไปในครอบครัวมันจะยากที่จะเรียนรู้จากถ้ามันมีความเชี่ยวชาญสูง

ตัวอย่างเล็ก ๆ น้อย ๆ ที่เหมาะสม:

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

อีกหนึ่งทางเลือกที่ดีที่จะมีสมาธิในการสร้างเครื่องมือสำหรับ MySQL ให้เป็น @NB แสดงให้เห็นในคำตอบก่อนหน้านี้

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

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

ฉันสามารถอ่านทรัพยากร / บทช่วยสอน / หนังสือใดให้เข้าใจ

มีหนังสือไม่กี่เล่ม:

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

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


5
นี่เป็นโพสต์ที่ดี
Chani

2
นี่มันสุดยอดมาก! ยิ่งมาจากคุณมากขึ้น :) ฉันต้องการยอมรับคำตอบเกือบทั้งหมด แต่เนื่องจากฉันต้องเลือกคำตอบนี้ I'm expecting a comment with a link to your repository when you're done: แน่นอนที่สุด! ขอขอบคุณอีกครั้งสำหรับคุณและคนอื่น ๆ ทั้งหมดนี้ยกระดับขึ้นอย่างมาก
Xananax

3
และสำหรับทุกคนที่มาที่นี่เพื่อค้นหาคำตอบเดียวกัน: ฉันคิดว่า flockDB เป็นผู้สมัครที่ดีที่สุดในการเรียนรู้ codebase มีขนาดเล็กมากรหัสอ่านได้ง่ายมาก (แม้ว่าฉันจะไม่พูดภาษาสกาล่า) และเข้าใจง่าย
Xananax

@Yannis, Btw หนังสือเล่มไหนที่คุณแนะนำคือหนังสือที่คุณอ่าน?
Pacerier

@Xananax Sooo เป็นยังไงบ้าง? ที่เก็บใด ๆ ที่เราสามารถดูได้? :)
Radu Murzea

27

คุณควรทำและหยุดคิดมากเกินไป เพลิดเพลินกับกระบวนการเรียนรู้และความกระตือรือร้นเป็นของขวัญ

ถามคนอื่น ๆ ถ้ามันเป็นความคิดที่ดีคือไม่แน่นอนกลยุทธ์ที่ดี ถ้าฉันฟังกบทั้งหมดฉันจะยังคงทำงานที่ Ikea วันนี้เพื่อผลักดันตะกร้าช้อปปิ้งจากที่จอดรถไปยังที่เก็บ

คุณไม่ได้ที่จะปรับตัวเองเช่น Ayende ได้ในที่โพสต์ที่น่าสนใจ คำถามคือ:

อย่างไรก็ตามในฐานะนักพัฒนาอย่างจริงจังฉันสงสัยว่าโครงการนี้เสนออะไรใหม่ในตลาดที่อิ่มตัวซึ่งคุณมีทางเลือกที่ค่อนข้างสมบูรณ์เช่น CouchDB, MongoDB, Tokyo, Redis และอีกมากมาย? ผลิตภัณฑ์เหล่านี้จำนวนมากยังข้ามแพลตฟอร์มและทำงานที่ความเร็ว C ด้วยสถิติที่พิสูจน์แล้วซึ่งถูกนำมาใช้ในเว็บไซต์ขนาดใหญ่มาก

หากคุณมีความสุขในกระบวนการไม่ต้องกังวลเกี่ยวกับวัตถุประสงค์คุณได้รับรางวัลไปแล้ว


4
+1, มีน้ำใจมากและคำตอบการสอน :-) ... คำตอบที่ดีจริงๆสำหรับใครบางคนที่ต้องการจะทำอะไรสักอย่าง
Pankaj Upadhyay

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

คำตอบของยานนิสนั้นดีกว่าของฉันและสมควรได้รับตัวเลือกของคุณ

6

"(หมายถึง" โหนด "ถ้าเป็นเช่นนั้น)" - นี่อาจเป็นเหตุผลว่าทำไมคุณถึงไม่พบมาก!

ดำน้ำในกับรุ่น 0.1 และดูว่าคุณจะได้รับ คุณอาจเรียนรู้เพิ่มเติมจากการพยายามทำสิ่งที่คุณต้องการจากการถามว่าคุณควรทำอะไร ให้เวลาสองสามวันแล้วตรวจสอบตำแหน่งที่คุณมี

ประมาณ 18 ปีที่แล้วฉันเขียนระบบฐานข้อมูลพื้นฐาน (เพื่อความสนุกสนานไปคิดเลข) พร้อมดัชนี btree และเรียนรู้มากมายอันยิ่งใหญ่



4

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

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

นี่คือวิธีที่ฉันจะเริ่มต้น:

  1. เลือกภาษาที่คุณชื่นชอบหรือภาษาที่คุณต้องการปรับปรุง
  2. สร้างวัตถุโหนด (หรือสิ่งที่ใกล้เคียงที่สุดในภาษาของคุณ) คิดออกว่าจะเชื่อมโยงพวกเขาอย่างไร
  3. ทำรายการย่อของคำสั่ง SQL ที่คุณจะใช้ก่อน
  4. ตัดสินใจว่าจะบันทึกข้อมูลอย่างไร วิธีแก้ปัญหาอย่างหนึ่งที่ชัดเจนคือการทำให้โหนดทั้งหมดเป็นอนุกรมโหลดเมื่อโปรแกรมเริ่มทำงานและบันทึกเมื่อโปรแกรมสิ้นสุด

หลังจากที่คุณได้รับข้อมูลเบื้องต้นเกี่ยวกับการทำงานคุณจะมีความเข้าใจมากขึ้นเกี่ยวกับสิ่งที่ยากหรือมีปัญหา จากนั้นคุณสามารถทำวิจัยเกี่ยวกับมันค้นหาการปรับปรุงและรวมเข้าด้วยกัน


1
ฉันกำลังทำตามขั้นตอนที่คุณแนะนำ 1,2,3 ไม่มีปัญหา อย่างไรก็ตามฉันถูกนิ่งงันด้วย # 4 ในกรณีที่มีข้อมูลจำนวนมากฉันจะโหลดหน่วยความจำเฉพาะส่วนที่เกี่ยวข้องได้อย่างไร ฉันคิดว่าการจัดเก็บทุกอย่างเป็นข้อมูลไบนารีและเก็บไฟล์ดัชนีอื่น แต่จะเกิดอะไรขึ้นหากผู้ใช้ไม่ได้ทำการสืบค้นด้วยดัชนี ฉันยังคงต้องวนซ้ำไฟล์ทั้งหมด ... ฉันเดาว่าถึงเวลาสำหรับคำถามอื่นแล้ว
Xananax

ทำไมไม่เก็บทุกอย่างไว้ในหน่วยความจำ? หากคุณอุทิศ 1 GB นั่นจะเก็บข้อมูลจำนวนมาก อีกวิธีหนึ่งคือจัดเก็บโหนดข้อมูลไบนารีแต่ละโหนดบนดิสก์จากนั้นคุณจะมีข้อความ 1 GB นั่นคือข้อความจำนวนมาก อย่างไรก็ตามฉันคิดว่าการจัดการฐานข้อมูลที่มีขนาดใหญ่กว่า 1GB นั้นไม่ได้เป็นศูนย์กลางของการออกกำลังกาย
B เซเว่น

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

3

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

เพื่อที่จะดูว่ามันเสร็จสิ้นแล้วฉันแนะนำให้ดูที่ SQLite แหล่งข้อมูล SQLiteเป็นเพียงประมาณ 1.3MB บีบอัดและเป็นฐานข้อมูลในการทำธุรกรรมอย่างเต็มที่กรดที่สอดคล้องกับ นอกจากนี้ยังเป็นสาธารณสมบัติและผู้เขียนหลักเป็นคนดีที่ฉันแน่ใจว่าจะยินดีตอบคำถามของคุณ (ฉันคิดว่าบิตที่ยากที่สุดมาถึงวิธีการส่งข้อมูลไปยังดิสก์อย่างแท้จริงการชักชวน OS และฮาร์ดแวร์เพื่อหยุดการโกหกและเขียนธุรกรรมจริงๆตอนนี้เป็นเรื่องยากอย่างน่าประหลาดใจและทำไมฉันดีใจที่ฉันไม่ต้องเขียนฐานข้อมูล)


1
codebase SQLite วิธี 0,2 * 10 ^ 6 loc (5MB แตก) ก็ไม่ว่าขนาดเล็ก
yannis

1
@ ยานนิส: เปรียบเทียบกับ MySQL หรือ PostgreSQL หรือระบบฐานข้อมูลเซิร์ฟเวอร์อื่น ๆ ...
Donal Fellows

3

ซื้อหนังสือ:

http://www.springer.com/computer/database+management+%26+information+retrieval/book/978-1-84628-394-9

ดัชนีเป็นสิ่งสำคัญที่สุดของฐานข้อมูลในปัจจุบัน ศึกษาทางเลือกที่มีอยู่เช่นต้นไม้ไบนารี

อ่านเกี่ยวกับผลิตภัณฑ์คาร์ทีเซียนซึ่งเป็นวิธีการคำนวณความซับซ้อนของการรวม


3

ฉันต้องการเรียนรู้วิธีการทำงานของฐานข้อมูล

เรียนรู้พีชคณิตเชิงสัมพันธ์

ค้นหาเครื่องมือ DB ขนาดเล็กเรียนรู้แหล่งที่มา

เพื่อให้สามารถใช้งานได้อย่างมีประสิทธิภาพยิ่งขึ้น

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

ใช้เส้นทางแบบดั้งเดิม: ใช้หลักสูตรอ่านหนังสือทบทวนถามคำถามใช้ลุคดัชนี


5
Learn relational algebra.สมมติว่าสหกรณ์มีความสนใจในฐานข้อมูลเชิงสัมพันธ์แน่นอน ...
Yannis
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.