3 คะแนน โดย GN⁺ 2024-11-20 | 5 ความคิดเห็น | แชร์ทาง WhatsApp
  • ส่วนขยายที่ทำให้สามารถฝังตัวฐานข้อมูล 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 ความคิดเห็น

 
sms8377 2024-11-22

ว้าว..

 
seunghaekim 2024-11-20

โอ้พระเจ้า...

 
xguru 2024-11-20

เป็นส่วนขยายที่ดูแปลก ๆ อยู่เหมือนกัน แต่พอลองคิดดูก็รู้สึกว่าอาจจะพอใช้ได้ในกรณีอย่างการทำ SaaS ที่ขยายต่อได้ แล้วผู้ใช้ต้องฝังความสามารถด้านฐานข้อมูลแบบง่าย ๆ เข้าไป

 
GN⁺ 2024-11-20
ความคิดเห็นจาก Hacker News
  • ระบบจัดการฐานข้อมูลเชิงสัมพันธ์ส่วนใหญ่ไม่รองรับเรกคอร์ดแบบซ้อนกัน และ SQL เองก็ขาดความสามารถในการสร้างหรือใช้งานตารางแบบซ้อนกัน

    • มีความเห็นว่า "ทัศนคติแบบนั้นใช้ไม่ได้"
  • มีการเสนอแนวคิดให้นำไดเรกทอรีฐานข้อมูล PostgreSQL ไปแพ็กเป็น tar แล้วเข้ารหัสเป็นไบนารีบล็อบใน SQLite

    • แม้จะไม่ค่อยใช้งานได้จริงหรือมีประโยชน์มากนัก แต่เป็นแนวคิดของการซ้อนฐานข้อมูล SQL เข้าไว้ด้วยกัน
  • มีการตั้งคำถามถึงกรณีการใช้งานของแนวคิดนี้

    • นำไปใช้ได้ยากเมื่อออกแบบสคีมาฐานข้อมูลในผลิตภัณฑ์ทั่วไป
    • สงสัยว่าเหมาะสำหรับแอปพลิเคชันแบบไฮบริดที่ต้องการสำรองข้อมูลผู้ใช้ในเครื่องร่วมกับข้อมูลบัญชีโดยตรงหรือไม่
  • มีความเห็นว่าคอลัมน์ SQLite น่าจะดีกว่าคอลัมน์ JSON ของ SQLite

    • ตัวดำเนินการของ JSON ต้องเรียนรู้ภาษาคิวรีอีกชุดหนึ่งและยังมีข้อจำกัด
  • กลไกไฟล์ /tmp ดูเหมือนการแฮ็ก และมีคำถามว่าจำเป็นจริงหรือไม่

    • อาจเป็นไปได้ที่จะสร้างฐานข้อมูล SQLite แบบอินเมมโมรี แล้วใช้ backup API หรือ VACUUM INTO เพื่อโหลดข้อมูลไบนารีบล็อบ
  • หากใช้ PostgreSQL ก็สามารถแก้ปัญหา multitenancy ได้ผ่าน Row Level Security(RLS)

    • การเพิ่มคอลัมน์ tenant ID ให้แต่ละตาราง และตั้งนโยบายให้ผู้เช่าหนึ่งรายเห็นได้เฉพาะข้อมูลของตนเองนั้นทำได้ง่ายมาก
  • อาชญากรรมต่อ 1NF (รูปแบบปกติที่หนึ่ง)?

  • มีข้อบ่นเรื่องไม่มีตัวดำเนินการ

    • อยากได้ดัชนีและไวยากรณ์ตัวดำเนินการแบบเฉพาะสำหรับการ join ข้ามฐานข้อมูลระหว่างหลายคอลัมน์ DATABASE