3 điểm bởi GN⁺ 2023-08-14 | 1 bình luận | Chia sẻ qua WhatsApp
  • 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ên lark
  • 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

 
GN⁺ 2023-08-14
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

    • Vì vậy có vẻ như mới có cộng đồng cơ sở dữ liệu quan hệ thuần Java. Như Hypersonic, H2, Derby chẳng hạn; nếu không cần quy mô cỡ thiết bị lớn, chúng dễ triển khai và sử dụng, và khi cần cũng dễ nhúng vào bộ nhớ
    • Hoàn toàn đồng ý. Về mặt đó, loạt bài ugit xây dựng Git từ đầu bằng Python thật sự rất hay: https://www.leshenko.net/p/ugit/
    • Tôi không chắc lắm. Python cũng tệ chẳng kém C/C++, và nếu muốn học cách xây dựng cơ sở dữ liệu thì nhược điểm là Python khiến bạn khó chạm tới nhiều phần thú vị đáng phải làm thử
      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
    • Công trình tuyệt vời. Tôi cũng có cảm giác tương tự, và Python giúp tôi tập trung vào các khái niệm cấp cao. Tuy vậy, thỉnh thoảng cũng có lúc tôi ước gì mình dùng kiểu tĩnh và một ngôn ngữ biên dịch
  • 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?

    • Hơi lạc đề một chút, nhưng bạn có biết tài liệu, bài nói chuyện hay bài blog hay nào về cách viết benchmark hữu ích không?
    • Triển khai thứ gì đó như TPC-C trong learndb rồi xem kết quả ra sao cũng có vẻ là một bài tập thú vị
  • 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...

    • Tôi rất khuyến nghị Lark cho các dự án Python. Dễ dùng
      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
    • DSL nằm trong chuỗi ư, đó có thật sự là cách hay không? Tôi không nhớ mình từng dùng hoặc cần thứ này trong Python, nhưng có cảm giác có thể có cách tốt hơn
      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ì đó
    • Tôi không có ý tỏ ra bất lịch sự, và cũng thừa nhận công việc này rất tuyệt và là một cách để học điều mới. Nhưng nếu tạo parser không phải mục tiêu cuối cùng mà chỉ là phương tiện để thực thi AST trong cơ sở dữ liệu, thì tôi tò mò không biết chỉ riêng phần parser sẽ giúp học được 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ị

    • Chắc chắn là vậy. Triển khai B-tree là động lực đầu tiên khiến tôi bắt đầu dự án này. Đặc biệt là các chi tiết liên quan đến tái cân bằng và tách node rất quan trọng
      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

    • Về đảm bảo ACID, không có khái niệm gom nhiều câu lệnh lại một cách nguyên tử, tức là transaction
      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