- 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
WOW..
Trời ơi...
pgrx - Framework để phát triển extension PostgreSQL bằng Rust
Đâ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.
Ý 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
Đề 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
Đặt câu hỏi về trường hợp sử dụng của ý tưởng này
Có ý kiến cho rằng một cột SQLite sẽ tốt hơn cột JSON của SQLite
Cơ chế dùng file
/tmptrô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ôngNếu dùng PostgreSQL, có thể giải quyết bài toán multi-tenancy thông qua Row Level Security (RLS)
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ử