Show HN: LearnDB - RDBMS (bản sao SQLite) được triển khai từ đầu bằng Python thuần
(github.com/spandanb)- LearnDB là một hệ quản trị cơ sở dữ liệu quan hệ (RDBMS) và bản sao SQLite được triển khai từ đầu nhằm hiểu sâu hơn về cấu trúc bên trong của cơ sở dữ liệu
- Được viết bằng Python thuần nên không có bước build, về cơ bản là zero-config, với cấu trúc cho phép ghi đè cấu hình
- Cung cấp learndb-sql hỗ trợ
select,from,where,group by,having,limit,order by, cùng lexer và parser tùy chỉnh dựa trênlark - Gồm engine nhận câu lệnh SQL để thao tác bảng và dữ liệu trong cơ sở dữ liệu, cùng cấu trúc dữ liệu sao lưu btree dựa trên đĩa
- Hỗ trợ các cách sử dụng: REPL, import như một module Python, và truyền file lệnh cho engine
- Codebase phù hợp để tinkering, nhưng có các hạn chế cốt lõi khiến không nên dùng làm giải pháp lưu trữ thực tế
- Số học dấu phẩy động được triển khai rất đơn giản so với IEEE754
- Không hỗ trợ các tiện ích phổ biến như mở rộng cột wildcard kiểu
select * ...
- Yêu cầu để chạy phát triển là hệ thống Linux/macOS và Python 3.9 trở lên; sử dụng
fcntlđể có quyền đọc độc quyền đối với file cơ sở dữ liệu - Tài liệu tham khảo gồm tutorial về cơ sở dữ liệu của cstack, SQLite Database System: Design and Implementation, tài liệu định dạng file SQLite, và tài liệu PostgreSQL
1 bình luận
Các ý kiến trên Hacker News
Tôi cho rằng viết một hệ thống như thế này bằng một ngôn ngữ như Python lại là một lựa chọn tuyệt vời. Cơ sở dữ liệu thường được viết bằng C++ hoặc C, nhưng với tôi Python dễ đọc và dễ tiếp cận hơn nhiều
Nếu nghiêm túc nhắm tới hiệu năng thì sau này có thể port sang ngôn ngữ cấp thấp, còn ở dạng hiện tại thì nó hữu ích cho mục đích học tập
Tôi cũng từng muốn học cách engine cơ sở dữ liệu có thể hoạt động trong môi trường phân tán, nên đã làm một cơ sở dữ liệu giả đa mô hình phân tán bằng Python, pha trộn các kiểu SQL/graph Cypher/document/DynamoDB: https://GitHub.com/samsquire/hash-db
C và Python đều trông có vẻ dễ tiếp cận nếu chỉ nhìn vào những phần dễ và bỏ qua thiết kế ngôn ngữ tệ, sự thiếu nhất quán cùng nhiều cạm bẫy. Nhưng với C thì ít nhất bạn còn có khả năng học cách làm cho đúng, còn với Python có khi bạn thậm chí không biết thế giới thực trông như thế nào
Từ rất lâu trước đây đã có người viết lại/port SQLite từ C sang C#: https://code.google.com/archive/p/csharp-sqlite/wikis/Letter...
Cũng đáng xem Dr. Richard Hipp đã hoan nghênh công việc đó như thế nào
Có lẽ bản trên GitHub nằm ở đây: https://github.com/CsharpDatabase/CsharpSQLite và sau đó có thể còn có thêm các clone khác
Tuyệt vời. Chắc hẳn đó là một trải nghiệm thú vị và đáng giá
Tôi biết mục tiêu không phải là làm cho nhanh, nhưng cho vui thì có thể tạo vài benchmark không?
Nhờ bài này tôi biết đến một thư viện parser cho Python tên là Lark, trông khá ổn
Tutorial JSON trên trang của họ rất hay. Nó chỉ cách tạo một parser cơ bản cho JSON, rồi trình bày khá chi tiết cách cải thiện hiệu năng: https://lark-parser.readthedocs.io/en/latest/json_tutorial.h...
Ngữ pháp được dùng trong dự án RDBMS nằm ở đây: https://github.com/spandanb/learndb-py/blob/master/learndb/l...
IDE này rất hữu ích khi debug ngữ pháp: https://www.lark-parser.org/ide/
EvaDB dùng Lark cho một ngôn ngữ giống SQL được điều chỉnh cho việc sử dụng mô hình AI: https://github.com/georgia-tech-db/evadb/blob/master/evadb/p... https://github.com/georgia-tech-db/evadb/
Nếu thích Lark thì cũng đáng cân nhắc tài trợ: https://github.com/sponsors/lark-parser
Chỉ cần dùng dict với các khóa dự kiến và cấu trúc thông qua toán tử OR bit thôi cũng có thể khớp tương đối với nhiều dạng ngữ pháp, vậy chẳng phải sẽ tốt hơn sao? import cứ để là import, và có lẽ có thể trộn chúng theo cách nào đó
Đây chỉ là suy nghĩ đầu tiên sau khi nhìn lướt qua, nên có thể tôi đã bỏ sót điều gì đó
Có phần nào phải tiếp tục tối ưu để làm cho parser được sinh ra hiệu quả hơn không?
Bước tiếp theo hợp lý có phải là tạo kế hoạch truy vấn tối ưu từ AST không?
Rất hay
SQLite rất khó đọc, nhưng bản triển khai này khá dễ hiểu. Đặc biệt là phần máy ảo: https://github.com/spandanb/learndb-py/blob/master/learndb/v...
Có thể so sánh với tệp này: https://github.com/sqlite/sqlite/blob/master/src/vdbe.c
Tuy nhiên tôi tò mò LearnDB này hoàn chỉnh đến mức nào. SQLite khó đọc không chỉ vì nó lâu đời, mà còn vì nó xử lý nhiều phần của SQL và trở nên phức tạp do phải tuân theo đặc tả SQL
SQLite có một bộ kiểm thử rất tốt, nên có lẽ sẽ hay nếu chạy bộ kiểm thử đó trên bản triển khai này
Thật sự hay, và có vẻ là một cách tốt để những người như tôi học cấu trúc dữ liệu và thuật toán tốt hơn. Tôi có thể giải thích B+tree hoạt động như thế nào, nhưng nếu bảo tự code thì chắc tôi sẽ khựng lại
Tôi thích cơ sở dữ liệu và Python nên quá trình xem lướt qua thật sự rất thú vị
Hơn nữa, việc đây là một cấu trúc được lưu trên đĩa cũng thêm một yếu tố phức tạp nữa khi nghĩ về cách triển khai
Nó có thể vượt qua được bao nhiêu phần trong bộ kiểm thử SQLite nhỉ?
Có hỗ trợ đảm bảo ACID hoặc lập kế hoạch/tối ưu hóa truy vấn không?
Tôi không hỏi theo nghĩa là nó phải làm được, chỉ muốn biết ngoài B-tree và SQL thì bạn đã thử đến đâu
Tôi cũng muốn thử làm thứ như thế này vào một ngày nào đó. Công trình rất tuyệt
Nhưng ngoài điểm đó ra, đây là cơ sở dữ liệu một tệp duy nhất, và chỉ một instance learndb có thể là tiến trình thao tác với tệp cơ sở dữ liệu. Vì vậy, xét như một cơ sở dữ liệu một kết nối, ta có được tính nhất quán và cô lập
Tính bền vững thì có được ở mức hệ thống tệp cung cấp độ bền vững. Vì vậy nó nằm đâu đó trong các tính chất ACID
Lập kế hoạch/tối ưu hóa truy vấn thì chưa được triển khai, nhưng tôi đã nghĩ về việc module tối ưu hóa có thể nằm ở đâu. Parser xuất ra AST, và có thể tối ưu hóa AST này hoặc một biểu diễn trung gian phát sinh từ nó
Tức là trước khi VM thực thi AST, ta có thể viết lại AST hoặc xóa các node
Hơi lạc đề một chút, nhưng trong Python có thứ gì giống mapDB không?
https://mapdb.org
Dự án tuyệt vời. Code cũng rất dễ đọc, và chú thích cũng rất tốt