Tạo hệ thống cơ sở dữ liệu của riêng tôi [đóng]


65

Tôi cần học cách cơ sở dữ liệu hoạt động để sử dụng chúng hiệu quả hơn, và cách học của tôi là bằng cách thực hiện.

Tôi muốn tạo hệ thống cơ sở dữ liệu của riêng tôi. Tôi không đề cập đến việc tạo một cơ sở dữ liệu giả sẽ sử dụng truy vấn để phân tích các tệp; đây đơn giản sẽ là một giao diện hệ thống tập tin với ngôn ngữ truy vấn. Tôi đang nói về cấu trúc thực tế của một công cụ cơ sở dữ liệu. Và vì những gì tôi có trong đầu không phải là quan hệ hay định hướng tài liệu (đó là "hướng nút", nếu điều đó còn tồn tại), tôi sẽ cần bất kỳ tài nguyên nào để trừu tượng và cao cấp nhất có thể.

Vì vậy, làm thế nào tôi sẽ đi về việc tạo ra điều đó? Những tài nguyên / hướng dẫn / sách nào tôi có thể đọc để hiểu?

Ngôn ngữ không quan trọng trong một chút. Lý tưởng nhất, mã sẽ là mã giả để minh họa khái niệm, không gắn với một ngôn ngữ cụ thể, nhưng bất cứ điều gì cũng sẽ làm được. Tôi không thể tìm thấy bất cứ điều gì về vấn đề này trên google (vì tôi không biết nhiều về chủ đề này, có lẽ tôi chỉ không tham gia tìm kiếm đúng).

Nếu các tài nguyên như vậy không có sẵn, thì tôi đoán điều gì đó về cách tạo một khách hàng ít nhất sẽ là một bước đi đúng hướng.


15
Tại sao không viết một trình biên dịch thay thế? Hoặc thậm chí tốt hơn, hệ điều hành của riêng bạn? Nếu bạn thực sự nghiêm túc về việc viết cơ sở dữ liệu của riêng bạn, có hàng ngàn và một cơ sở dữ liệu nguồn mở ngoài kia: Nghiên cứu mã nguồn của họ, đóng góp một vài bản vá. Sau đó bắt đầu nghĩ đến việc xây dựng của riêng bạn.
yannis

4
Bạn có thể học một số khóa học cơ sở dữ liệu trình độ đại học và sau đại học. Có nhiều khóa học nguồn mở trực tuyến. Bạn cũng có thể mua một vài cuốn sách giáo khoa và nghiên cứu chúng trong thời gian rảnh. Điều này sẽ cung cấp cho bạn một số ý tưởng và điểm bắt đầu. Đọc lịch sử và tin tức về PostgreSQL cũng sẽ giúp ích (về trí tưởng tượng, mặc dù nó sẽ không cho bạn biết bất kỳ tính năng nào được triển khai thực sự)
rwong

9
I studied open-source DBs, but their codebase is too huge: Nếu thứ gì đó như redis hoặc flockdb quá lớn để bạn đọc, tôi không thấy cách bạn sẽ đối phó với việc viết hoặc sở hữu cơ sở dữ liệu.
yannis

10
@YannisRizos Công bằng mà nói, đọc mã (imo) khó hơn nhiều so với việc tự viết nó.
AlexWebr

12
@Xananax: đừng nghe những con ếch ( crystal-reflections.com/stories/story_73.htm ). Làm bất cứ điều gì bạn thích và không cần thiết phải có một mục tiêu để đạt được niềm vui trong quá trình này.

Câu trả lời:


61

(đó là "hướng nút", nếu điều đó thậm chí còn tồn tại)

Bắt đầu ở đây. Khi làm việc với một ứng dụng phức tạp như cơ sở dữ liệu (thậm chí cơ sở dữ liệu đơn giản là một ứng dụng phức tạp), bạn nên làm quen với lịch sử của tên miền và thuật ngữ thích hợp và có ít nhất một ý tưởng rất cao về kiến ​​trúc. Bạn có thể bắt đầu từ bài viết Wikipedia trên Cơ sở dữ liệu . Dành vài ngày để đọc tất cả các bài viết về các khái niệm liên quan và các loại cơ sở dữ liệu khác nhau.

Và vì những gì tôi có trong tâm trí không phải là quan hệ hay định hướng tài liệu

Tiếp theo, bạn chọn Quan hệ hoặc NoSQl. Nếu bạn chọn NoQuery, bạn nên chọn một loại NoQuery. Điều đó cực kỳ quan trọng, bạn sẽ không tìm thấy bất kỳ tài liệu kiến ​​trúc nào thảo luận về tất cả các họ cơ sở dữ liệu khác nhau. Nó không thực sự quan trọng với cái nào bạn chọn, chỉ cần chọn một và gắn bó với nó.

Ngôn ngữ không quan trọng trong một chút.

Đúng vậy (thật không may), vì sau khi bạn chọn một họ cơ sở dữ liệu, bạn nên bắt đầu khám phá mã từ cơ sở dữ liệu nguồn mở của gia đình đó. Có một vài hướng dẫn chung về những gì cần tìm:

  • Codebase tương đối nhỏ,
  • Tài liệu kiến ​​trúc hoặc ít nhất là một blog phát triển,
  • Cơ sở dữ liệu bạn chọn phải gần với những gì được coi là chung trong gia đình, sẽ khó học hơn nếu nó có tính chuyên môn cao.

Một vài ví dụ phù hợp:

Lấy nguồn, biên dịch nó và chơi xung quanh nó. Bạn không phải gửi các bản vá hoặc bất cứ thứ gì ưa thích, chỉ cần khám phá mã và thực hiện các thay đổi nhỏ ở đây và ở đó để xem điều gì sẽ xảy ra. Đó là một quá trình gia tăng, bạn càng chơi xung quanh nó, bạn sẽ càng dễ hiểu mã hơn. Nếu dự án đầu tiên bạn chọn có vẻ cực kỳ khó hiểu, hãy chuyển sang dự án tiếp theo.

Một lựa chọn tuyệt vời khác là tập trung vào việc xây dựng một công cụ cho MySQL, như @NB gợi ý trong một câu trả lời trước đó .

Nếu bạn đạt đến điểm mà bạn có thể làm điều gì đó hữu ích với codebase, hãy tham gia vào cộng đồng của dự án, đó là cách dễ nhất để tìm tài nguyên chi tiết hơn về các khái niệm liên quan.

Và cuối cùng, bắt đầu làm việc trên cơ sở dữ liệu của bạn. Lúc đầu, bạn chỉ có thể viết lên một bản sao vô cùng thu nhỏ của mã bạn đang khám phá. Nó không phải là bản gốc, khá nhiều dự án lớn bắt đầu như bản sao hoặc dĩa.

Những tài nguyên / hướng dẫn / sách nào tôi có thể đọc để hiểu?

Có khá nhiều cuốn sách:

Và vài trăm người khác, cộng với vô số bài báo học thuật bạn có thể dễ dàng theo dõi qua Google. Bạn cần xác định những gì bạn muốn làm đầu tiên, và sau đó tìm kiếm một cuốn sách. Tham gia với cộng đồng các tác giả cơ sở dữ liệu đồng nghiệp cũng sẽ giúp bạn thu hẹp danh sách các cuốn sách và có thể nhận được nhiều đề xuất tốt hơn nhiều so với ở trên.

Chúc may mắn! Tôi đang mong đợi một bình luận có liên kết đến kho lưu trữ của bạn khi bạn hoàn thành. Và nếu bạn chưa bao giờ hoàn thành, hãy chắc chắn rằng bạn để lại một bình luận nhắc nhở tôi rằng tôi vẫn chưa hoàn thành trình biên dịch mà tôi bắt đầu viết vào năm 2001.


5
đây là bài viết hay
Chani

2
Đây là một siêu nhân! Thậm chí nhiều hơn đến từ bạn :) Tôi muốn chấp nhận hầu hết câu trả lời cho nhau nhưng vì tôi phải chọn một câu hỏi phải như vậy. I'm expecting a comment with a link to your repository when you're done: chắc chắn nhất! Cảm ơn một lần nữa, với bạn và những người khác, điều này thực sự rất nâng cao.
Xananax

3
Và đối với bất kỳ ai đến đây để tìm kiếm câu trả lời giống nhau: Tôi thấy flockDB là ứng cử viên tốt nhất để học, codebase thực sự rất nhỏ, mã rất dễ đọc (mặc dù tôi không nói scala) và dễ hiểu.
Xananax

@Yannis, Btw cuốn sách nào bạn giới thiệu là những cuốn bạn đã đọc?
Pacerier

@Xananax Sooo nó như thế nào? Bất kỳ kho lưu trữ chúng ta có thể nhìn vào? :)
Radu Murzea

27

Bạn chỉ nên làm điều đó và ngừng suy nghĩ quá nhiều. Tận hưởng quá trình học tập và say mê là những món quà.

Hỏi người khác nếu đó là một ý tưởng tốt chắc chắn không phải là một chiến lược tốt . Nếu tôi đã lắng nghe tất cả những con ếch, tôi vẫn sẽ làm việc tại Ikea hôm nay đẩy xe mua hàng từ bãi đậu xe đến kho.

Bạn không cần phải biện minh cho mình như Ayende đã làm trong bài viết thú vị đó . Câu hỏi là:

Tuy nhiên, là một nhà phát triển thực dụng, tôi tự hỏi dự án này sẽ cung cấp những gì mới trong một thị trường bão hòa, nơi bạn có các lựa chọn thay thế khá trưởng thành như CouchDB, MongoDB, Tokyo, Redis, và nhiều hơn nữa? Nhiều trong số các sản phẩm này cũng đa nền tảng và chạy ở tốc độ C với một kỷ lục đã được chứng minh, được sử dụng trong các trang web rất lớn, nơi khả năng bảo vệ và khả năng chịu lỗi của chúng đã bị đẩy xa.

Nếu bạn hài lòng trong quá trình này, đừng lo lắng về mục tiêu, bạn đã chiến thắng.


4
+1, trả lời rất chu đáo và giảng dạy :-) ... câu trả lời thực sự hay cho ai đó muốn làm điều gì đó
Pankaj Upadhyay

Thực sự rất tốt đẹp. Tôi đã trên bờ vực chấp nhận điều này. Tôi đã không làm thế bởi vì tôi nghĩ câu trả lời của yannis có ý nghĩa hơn và có nhiều khả năng giúp mọi người có cùng câu hỏi. Nhưng điều này chắc chắn là đáng khích lệ. Cảm ơn rất nhiều.
Xananax

Câu trả lời của Yannis tốt hơn câu trả lời của tôi và xứng đáng với sự lựa chọn của bạn

6

"(Đó là" hướng nút ", nếu điều đó thậm chí còn tồn tại)". - Đây có thể là lý do tại sao bạn không tìm thấy nhiều!

Lặn với phiên bản 0.1 và xem nơi bạn nhận được. Bạn có thể học hỏi nhiều hơn từ việc cố gắng tạo ra những gì bạn muốn mà từ việc hỏi những gì bạn "nên" làm. Cho nó một vài ngày và sau đó xem lại nơi bạn đã có.

Khoảng 18 năm trước tôi đã viết một hệ thống cơ sở dữ liệu cơ bản (để giải trí, tìm hiểu) với các chỉ số btree và học được rất nhiều điều kinh khủng.



4

Âm thanh như một dự án tuyệt vời. Rõ ràng mục tiêu của bạn không phải là tạo ra một phần mềm sản xuất, mà là để tìm hiểu về cơ sở dữ liệu và quá trình tạo ra một hệ thống cơ sở dữ liệu.

Tôi thực sự không nghĩ rằng bạn cần phải thực hiện nhiều nghiên cứu. Có vẻ như mục đích là để có được trải nghiệm về những gì cần thiết để tạo ra một hệ thống cơ sở dữ liệu dựa trên nút.

Đây là cách tôi sẽ bắt đầu:

  1. Chọn ngôn ngữ yêu thích của bạn hoặc ngôn ngữ mà bạn muốn cải thiện.
  2. Tạo đối tượng nút (hoặc bất cứ điều gì gần nhất trong ngôn ngữ của bạn). Tìm hiểu làm thế nào để liên kết chúng.
  3. Tạo một danh sách ngắn các câu lệnh SQL mà bạn sẽ triển khai trước.
  4. Quyết định cách lưu dữ liệu. Một giải pháp rõ ràng là tuần tự hóa tất cả các nút, tải chúng khi chương trình khởi động và lưu chúng khi chương trình kết thúc.

Sau khi bạn có được những điều cơ bản hoạt động, bạn sẽ có cái nhìn sâu sắc hơn nhiều về những gì khó khăn hoặc có vấn đề. Sau đó, bạn có thể thực hiện một số nghiên cứu về nó, tìm một số cải tiến và tích hợp chúng.


1
Tôi đang làm theo các bước bạn đề nghị. 1,2,3 không có vấn đề. Tuy nhiên, tôi bị cản trở bởi # 4. Trong trường hợp lượng dữ liệu lớn, làm thế nào tôi chỉ tải trong bộ nhớ những phần có liên quan? Tôi đã nghĩ đến việc lưu trữ mọi thứ dưới dạng dữ liệu nhị phân và giữ một tệp chỉ mục khác, nhưng nếu người dùng không truy vấn theo chỉ mục thì sao? Tôi vẫn sẽ phải lặp lại toàn bộ tập tin ... Tôi đoán đó là thời gian cho một câu hỏi khác
Xananax

Tại sao không chỉ lưu trữ mọi thứ trong bộ nhớ? Nếu bạn dành 1 GB, điều đó sẽ chứa rất nhiều dữ liệu. Thay phiên, lưu trữ từng nút dữ liệu nhị phân trên đĩa và sau đó bạn sẽ có 1 GB cho văn bản. Đó là rất nhiều văn bản. Dù sao, tôi nghĩ rằng việc xử lý một cơ sở dữ liệu lớn hơn 1GB không phải là trọng tâm của bài tập.
B Bảy

Ngoài ra, bạn có thể tạo nhiều phương thức để hoạt động hiệu quả trong vòng 1 GB bộ nhớ. Bạn có thể cải thiện một phần của hệ thống sau này. Một giải pháp là tải tất cả thông tin nút vào bộ nhớ, nhưng lưu trữ dữ liệu của từng nút trên đĩa. Bằng cách đó bạn có thể truy cập các nút một cách hiệu quả và chỉ truy cập vào đĩa để lấy dữ liệu bạn thực sự cần.
B Bảy

3

Viết cơ sở dữ liệu của riêng bạn để hiểu tất cả mọi thứ hoạt động như thế nào Bạn thật điên rồ, nhưng theo một cách tốt!

Để xem nó được thực hiện như thế nào, tôi khuyên bạn nên xem SQLite. Nguồn SQLite chỉ được nén khoảng 1,3 MB và đó là cơ sở dữ liệu giao dịch tuân thủ ACID hoàn toàn. Đó cũng là miền công cộng và tác giả chính là một chàng trai tốt, tôi chắc chắn sẽ rất vui khi trả lời câu hỏi của bạn. (Tôi nghĩ rằng các bit khó khăn nhất đến làm thế nào để thực sự cam kết thông tin vào đĩa; thuyết phục hệ điều hành và phần cứng để ngừng nói dối và thực sự ghi giao dịch BÂY GIỜ là đáng ngạc nhiên khó khăn và lý do tại sao Tôi rất vui vì tôi không bao giờ phải viết một DB.)


1
Cơ sở mã SQLite tiếp cận 0,2 * 10 ^ 6 loc (giải nén 5mb), nó không phải nhỏ.
yannis

1
@Yannis: So sánh với MySQL hoặc PostgreSQL hoặc bất kỳ máy chủ DB nào khác hệ thống
Donal Fellows


3

Tôi cần học cách cơ sở dữ liệu hoạt động

Tìm hiểu đại số quan hệ.

Tìm một công cụ DB nhỏ, tìm hiểu nguồn.

để sử dụng chúng hiệu quả hơn

Không. Bạn cần học cách sử dụng hiệu quả cơ sở dữ liệu. Bạn có thể là người lái xe tốt hơn nếu bạn hiểu cách chiếc xe của bạn hoạt động, nhưng bạn sẽ là người lái xe tốt hơn nhiều nếu bạn thực sự tập trung vào việc lái xe.

Đi theo con đường truyền thống: tham gia một khóa học, đọc một cuốn sách, đánh giá ngang hàng, đặt câu hỏi, sử dụng chỉ số luke .


5
Learn relational algebra.Giả sử op quan tâm đến cơ sở dữ liệu quan hệ tất nhiên ...
yannis
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.