3 điểm bởi GN⁺ 2024-11-20 | 5 bình luận | Chia sẻ qua WhatsApp
  • Một extension cho phép nhúng chính cơ sở dữ liệu SQLite vào bảng PostgreSQL dưới dạng kiểu cột SQLITE
    • Giải quyết multitenancy theo cách này
  • Tạo DB trống bằng empty_sqlite: CREATE TABLE people (name TEXT NOT NULL, database SQLITE DEFAULT execute_sqlite(empty_sqlite(), 'CREATE TABLE todos (task TEXT)'));
  • Có thể truy vấn bằng hàm query_sqlite, chèn/cập nhật bằng execute_sqlite
    • SELECT * FROM query_sqlite(database, 'SELECT * FROM todos');
    • `UPDATE people SET database = execute_sqlite(database, 'INSERT INTO todos VALUES (''solve multitenancy'')') WHERE name = 'frectonz';
  • Đọc một cột cụ thể bằng các hàm get_sqlite_text/get_sqlite_integer/get_sqlite_real: SELECT get_sqlite_text(sqlite_row, 0) FROM query_sqlite(database, 'SELECT * FROM todos');
  • Được viết bằng Rust + framework Pgrx
  • Chi tiết triển khai:
    • Lưu DB dưới dạng Vec<u8> được mã hóa bằng CBOR (Concise Binary Object Representation)
    • Khi thực thi truy vấn, tạo thành tệp ngẫu nhiên trong thư mục /tmp. SQLite nạp tệp để chạy truy vấn và trả về kết quả dưới dạng bảng một hàng chứa các giá trị được mã hóa JSON

5 bình luận

 
sms8377 2024-11-22

WOW..

 
seunghaekim 2024-11-20

Trời ơi...

 
xguru 2024-11-20

Đây đúng là một extension hơi kỳ lạ, nhưng khi xây dựng SaaS có khả năng mở rộng, có lẽ cũng sẽ hữu ích trong những trường hợp người dùng cần nhúng các chức năng DB đơn giản.

 
GN⁺ 2024-11-20
Ý kiến trên Hacker News
  • Hầu hết các hệ quản trị cơ sở dữ liệu quan hệ không hỗ trợ bản ghi lồng nhau, và SQL cũng thiếu khả năng tạo hoặc tận dụng bảng lồng nhau

    • Có ý kiến cho rằng “với thái độ đó thì không ổn”
  • Đề xuất ý tưởng đóng gói thư mục cơ sở dữ liệu PostgreSQL thành tar và mã hóa nó thành blob nhị phân trong SQLite

    • Không thực sự thực dụng hay hữu ích, nhưng đây là một khái niệm lồng cơ sở dữ liệu SQL vào nhau
  • Đặt câu hỏi về trường hợp sử dụng của ý tưởng này

    • Khó dùng khi thiết kế schema cơ sở dữ liệu cho một sản phẩm thông thường
    • Tò mò liệu nó có dành cho việc sao lưu trực tiếp dữ liệu người dùng cục bộ cùng với thông tin tài khoản trong các ứng dụng hybrid hay không
  • Có ý kiến cho rằng một cột SQLite sẽ tốt hơn cột JSON của SQLite

    • Toán tử JSON đòi hỏi phải học một ngôn ngữ truy vấn riêng và còn bị hạn chế
  • Cơ chế dùng file /tmp trông giống như một mẹo hack và bị đặt câu hỏi là có thực sự cần thiết hay không

    • Có thể tạo cơ sở dữ liệu SQLite trong bộ nhớ rồi dùng backup API hoặc VACUUM INTO để nạp dữ liệu blob nhị phân
  • Nếu dùng PostgreSQL, có thể giải quyết bài toán multi-tenancy thông qua Row Level Security (RLS)

    • Việc thêm cột tenant ID vào mỗi bảng và thiết lập chính sách để chỉ một tenant có thể xem dữ liệu là rất dễ
  • Tội ác chống lại 1NF (dạng chuẩn thứ nhất)?

  • Phàn nàn về việc thiếu toán tử

    • Muốn có chỉ mục và cú pháp toán tử đặc biệt để thực hiện join liên cơ sở dữ liệu giữa nhiều cột DATABASE