Làm thế nào để viết một công cụ cơ sở dữ liệu đơn giản [đóng]


143

Tôi quan tâm đến việc tìm hiểu làm thế nào một công cụ cơ sở dữ liệu hoạt động (tức là nội bộ của nó). Tôi biết hầu hết các cấu trúc dữ liệu cơ bản được dạy trong CS (cây, bảng băm, danh sách, v.v.) cũng như hiểu khá rõ về lý thuyết trình biên dịch (và đã triển khai một trình thông dịch rất đơn giản) nhưng tôi không hiểu cách đi về việc viết một công cụ cơ sở dữ liệu. Tôi đã tìm kiếm các hướng dẫn về chủ đề này và tôi không thể tìm thấy bất kỳ, vì vậy tôi hy vọng người khác có thể chỉ cho tôi đi đúng hướng. Về cơ bản, tôi muốn thông tin về những điều sau đây:

  • Cách dữ liệu được lưu trữ bên trong (tức là cách các bảng được biểu diễn, v.v.)
  • Cách công cụ tìm dữ liệu mà nó cần (ví dụ: chạy truy vấn SELECT)
  • Làm thế nào dữ liệu được chèn theo cách nhanh chóng và hiệu quả

Và bất kỳ chủ đề khác có thể có liên quan đến điều này. Nó không phải là một cơ sở dữ liệu trên đĩa - ngay cả một cơ sở dữ liệu trong bộ nhớ cũng ổn (nếu dễ hơn) vì tôi chỉ muốn tìm hiểu các hiệu trưởng đằng sau nó.

Rất cảm ơn vì sự giúp đỡ của bạn.

Câu trả lời:


55

Nếu bạn giỏi đọc mã, nghiên cứu SQLite sẽ dạy cho bạn toàn bộ khối lượng thiết kế cơ sở dữ liệu. Nó nhỏ, vì vậy dễ dàng hơn để quấn đầu của bạn. Nhưng nó cũng được viết một cách chuyên nghiệp.

http://sqlite.org/


2
LỘC của shell.c tải sqlite => 3135, sqlite3.c => 136.332, sqlite3ext.h => 447, sqlite3.h => 7097, tổng => 147.011
Khaja Minhajuddin

1
Có lẽ là nhỏ như bạn có thể tạo ra một công cụ cơ sở dữ liệu đầy đủ chức năng bằng cách sử dụng ngôn ngữ ngoặc nhọn. SQLite cũng có sẵn trong C #.
Robert Harvey


4
Tôi khuyên bạn nên đọc mã của SQLite 2.5.0: github.com/davideuler/SQLite-2.5.0-for-code-reading , đây là phiên bản đầu tiên của SQLite có thể được biên dịch và chạy trên GCC hiện đại (Tôi đã thử nghiệm nó trên MacOS 10.13 và Debian 8)
david euler

1
cstack.github.io/db_tutorial là điểm khởi đầu tốt.
Ashish Negi

25

Câu trả lời cho câu hỏi này là rất lớn. mong đợi một luận án PHD sẽ trả lời 100%;) nhưng chúng ta có thể nghĩ về từng vấn đề một:

  • Cách lưu trữ dữ liệu trong nội bộ: bạn nên có một tệp dữ liệu chứa các đối tượng cơ sở dữ liệu của mình và cơ chế lưu trữ để tải dữ liệu tập trung và một số dữ liệu xung quanh vào RAM giả sử bạn có một bảng, với một số dữ liệu, chúng tôi sẽ tạo định dạng dữ liệu để chuyển đổi bảng này thành tệp nhị phân, bằng cách đồng ý với định nghĩa của dấu phân cách cột và dấu phân cách hàng và đảm bảo mẫu dấu phân cách như vậy không bao giờ được sử dụng trong chính dữ liệu của bạn. tức là nếu bạn đã chọn <*> ví dụ để tách các cột, bạn nên xác thực dữ liệu bạn đang đặt trong bảng này để không chứa mẫu này. bạn cũng có thể sử dụng tiêu đề hàng và tiêu đề cột bằng cách chỉ định kích thước của hàng và một số chỉ mục nội bộ để tăng tốc tìm kiếm của bạn và ở đầu mỗi cột có độ dài của cột này như "Adam", 1, 11.1, "

  • Cách tìm các mục một cách nhanh chóng thử sử dụng băm và lập chỉ mục để trỏ đến dữ liệu được lưu trữ và lưu trữ dựa trên các tiêu chí khác nhau lấy ví dụ ở trên, bạn có thể sắp xếp giá trị của cột đầu tiên và lưu trữ trong một đối tượng riêng biệt chỉ vào id hàng của các mục được sắp xếp theo thứ tự bảng chữ cái , và như thế

  • Làm thế nào để tăng tốc độ chèn dữ liệu mà tôi biết từ Oracle là họ chèn dữ liệu vào một vị trí tạm thời cả trong RAM và trên đĩa và làm công việc vệ sinh định kỳ, công cụ cơ sở dữ liệu luôn bận rộn tối ưu hóa cấu trúc của nó nhưng đồng thời chúng tôi không muốn mất dữ liệu trong trường hợp mất điện của một cái gì đó như thế. Vì vậy, hãy cố gắng giữ dữ liệu ở nơi tạm thời này mà không cần sắp xếp, nối thêm bộ nhớ ban đầu của bạn và sau này khi hệ thống miễn phí sử dụng các chỉ mục của bạn và xóa vùng tạm thời khi hoàn tất

chúc may mắn, dự án tuyệt vời


11

SQLite đã được đề cập trước đây, nhưng tôi muốn thêm một số điều.

Cá nhân tôi đã học được rất nhiều bằng cách nghiên cứu SQlite. Điều thú vị là, tôi đã không đi đến mã nguồn (mặc dù tôi chỉ có một cái nhìn ngắn). Tôi đã học được nhiều bằng cách đọc các tài liệu kỹ thuật và đặc biệt xem xét các lệnh nội bộ mà nó tạo ra. Nó có một trình thông dịch dựa trên ngăn xếp riêng bên trong và bạn có thể đọc P-Code mà nó tạo ra bên trong chỉ bằng cách sử dụng giải thích. Do đó, bạn có thể thấy các cấu trúc khác nhau được dịch sang động cơ cấp thấp (điều đó đơn giản đến mức đáng ngạc nhiên - nhưng đó cũng là bí mật về tính ổn định và hiệu quả của nó).



9

Được rồi, tôi đã tìm thấy một trang web có một số thông tin về SQL và triển khai - hơi khó để liên kết đến trang liệt kê tất cả các hướng dẫn, vì vậy tôi sẽ liên kết từng cái một:


8

Tôi sẽ đề nghị tập trung vào www.sqlite.org

Gần đây, nhỏ (mã nguồn 1MB), nguồn mở (để bạn có thể tự mình tìm ra) ...

Sách đã được viết về cách nó được thực hiện:

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

Nó chạy trên nhiều hệ điều hành cho cả máy tính để bàn và điện thoại di động nên việc thử nghiệm rất dễ dàng và tìm hiểu về nó sẽ hữu ích ngay bây giờ và trong tương lai.

Nó thậm chí còn có một cộng đồng tử tế ở đây: /programming/tagged/sqlite


1
Kích thước byte cho 3.10 bây giờ là gần 7,0 mb mã nguồn. Chỉ một số ít người có thể tiêu hóa tất cả những gì trong một lần ngồi. Tuy nhiên, đây cũng là một nơi tốt để bắt đầu.
Laurie Stearn

1
Thật. Gần đây đã dành một chút thời gian bên trong mã nguồn của SQLite để tìm ra lỗi trong SQLCodes, đó là một cơn ác mộng tuyệt đối. Cuộc sống đơn giản hơn 6 năm trước :-)
michael aubert

Chỉ là một câu hỏi nhanh khi tôi bỏ lỡ bữa tiệc, tôi đoán nó sẽ thoải mái hơn nhiều (và có thể hữu ích) để bắt đầu từ phiên bản đầu tiên? Trên thực tế tôi nên làm như vậy cho tất cả đọc mã nghiêm trọng của các dự án lớn?
Nicholas Humphrey

7

có thể bạn có thể học từ HSQLDB . Tôi nghĩ rằng họ cung cấp cơ sở dữ liệu nhỏ và đơn giản cho việc học. bạn có thể xem các mã vì nó là nguồn mở.


3

Tôi không chắc liệu nó có phù hợp với yêu cầu của bạn hay không nhưng tôi đã triển khai một cơ sở dữ liệu định hướng tệp đơn giản với sự hỗ trợ cho đơn giản ( SELECT, INSERT , UPDATE) bằng cách sử dụng perl.
Những gì tôi đã làm là tôi lưu trữ mỗi bảng dưới dạng một tệp trên đĩa và các mục với một mẫu được xác định rõ và thao tác dữ liệu bằng các công cụ linux được xây dựng như awk và sed. để cải thiện hiệu quả, dữ liệu thường xuyên truy cập được lưu trữ.


1
Bạn vẫn còn mã, bạn có thể chia sẻ một liên kết
GK1

3

Nếu MySQL làm bạn quan tâm, tôi cũng sẽ đề xuất trang wiki này , nơi có một số thông tin về cách thức hoạt động của MySQL. Ngoài ra, bạn có thể muốn xem Tìm hiểu về Nội bộ MySQL .

Bạn cũng có thể xem xét việc xem xét giao diện không phải SQL cho công cụ Cơ sở dữ liệu của mình. Xin hãy xem Apache CouchDB . Đó là những gì bạn sẽ gọi, một hệ thống cơ sở dữ liệu định hướng tài liệu.

Chúc may mắn!


ANd nếu bạn muốn xem một db khác: sqlserveriternals.com các sách của cô ấy trên các máy chủ của máy chủ SQl là mục tiêu hàng đầu.
HLGEM
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.