- ส่วนขยายที่ทำให้สามารถฝังตัวฐานข้อมูล SQLite เองลงใน PostgreSQL ได้ด้วยคอลัมน์ชนิด
SQLITE
- ใช้วิธีนี้เพื่อแก้ปัญหา multitenancy
- สร้าง DB เปล่าด้วย
empty_sqlite : CREATE TABLE people (name TEXT NOT NULL, database SQLITE DEFAULT execute_sqlite(empty_sqlite(), 'CREATE TABLE todos (task TEXT)'));
- สามารถคิวรีได้ด้วยฟังก์ชัน
query_sqlite และ insert/update ได้ด้วย 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';
- อ่านคอลัมน์ที่ต้องการได้ด้วยฟังก์ชัน
get_sqlite_text/get_sqlite_integer/get_sqlite_real : SELECT get_sqlite_text(sqlite_row, 0) FROM query_sqlite(database, 'SELECT * FROM todos');
- เขียนด้วย Rust + เฟรมเวิร์ก Pgrx
- รายละเอียดการทำงาน:
- จัดเก็บ DB เป็น
Vec<u8> ที่เข้ารหัสด้วย CBOR (Concise Binary Object Representation)
- ตอนรันคิวรีจะสร้างเป็นไฟล์สุ่มในโฟลเดอร์ /tmp จากนั้น SQLite จะโหลดไฟล์เพื่อรันคิวรี และส่งผลลัพธ์กลับมาเป็นตารางแถวเดียวที่มีค่าแบบเข้ารหัส JSON อยู่
5 ความคิดเห็น
ว้าว..
โอ้พระเจ้า...
pgrx - เฟรมเวิร์กสำหรับพัฒนาส่วนขยาย PostgreSQL ด้วย Rust
เป็นส่วนขยายที่ดูแปลก ๆ อยู่เหมือนกัน แต่พอลองคิดดูก็รู้สึกว่าอาจจะพอใช้ได้ในกรณีอย่างการทำ SaaS ที่ขยายต่อได้ แล้วผู้ใช้ต้องฝังความสามารถด้านฐานข้อมูลแบบง่าย ๆ เข้าไป
ความคิดเห็นจาก Hacker News
ระบบจัดการฐานข้อมูลเชิงสัมพันธ์ส่วนใหญ่ไม่รองรับเรกคอร์ดแบบซ้อนกัน และ SQL เองก็ขาดความสามารถในการสร้างหรือใช้งานตารางแบบซ้อนกัน
มีการเสนอแนวคิดให้นำไดเรกทอรีฐานข้อมูล PostgreSQL ไปแพ็กเป็น tar แล้วเข้ารหัสเป็นไบนารีบล็อบใน SQLite
มีการตั้งคำถามถึงกรณีการใช้งานของแนวคิดนี้
มีความเห็นว่าคอลัมน์ SQLite น่าจะดีกว่าคอลัมน์ JSON ของ SQLite
กลไกไฟล์
/tmpดูเหมือนการแฮ็ก และมีคำถามว่าจำเป็นจริงหรือไม่VACUUM INTOเพื่อโหลดข้อมูลไบนารีบล็อบหากใช้ PostgreSQL ก็สามารถแก้ปัญหา multitenancy ได้ผ่าน Row Level Security(RLS)
อาชญากรรมต่อ 1NF (รูปแบบปกติที่หนึ่ง)?
มีข้อบ่นเรื่องไม่มีตัวดำเนินการ