- หลังจากได้ลองใช้ SQLite อยู่หลายวัน ก็ได้พบข้อเสียที่น่าประหลาดใจอยู่หลายอย่าง
- ไม่รองรับ
ALTER COLUMN คำแนะนำอย่างเป็นทางการสำหรับการแก้ไขคอลัมน์คือ "สร้างตารางใหม่"
- ไม่รองรับ
DROP CONSTRAINT คำแนะนำอย่างเป็นทางการสำหรับการลบข้อจำกัดคือ "สร้างตารางใหม่"
- SQLite ไม่มีชนิดข้อมูลที่ระดับคอลัมน์ ชนิดข้อมูลมีอยู่แค่กับค่าข้อมูลเท่านั้น (มีเพียง 5 ชนิด) ดังนั้นอะไรก็สามารถใส่ลงไปที่ไหนก็ได้
- หากร้องขอคอลัมน์ที่เป็นชนิดข้อมูลที่ไม่รองรับหรือไม่มีอยู่ มันจะทำงานผิดแบบเงียบ ๆ โดยไม่มีคำเตือนหรือข้อผิดพลาด การสร้างสคีมาอย่าง
CREATE TABLE my_table (id bigserial, messages jsonb[]) ดูเหมือนจะใช้ได้ ทำให้ในวันแรกผมเข้าใจผิดว่า SQLite รองรับ serial และ array
- สามารถใช้
CREATE TABLE my_table (...) STRICT เพื่อบังคับให้ยอมรับได้เฉพาะ 5 ชนิดที่รองรับคือ integer, real, text, blob, any
- ช่วงหลังมีความสนใจมากขึ้นเกี่ยวกับการรองรับ
jsonb แบบใหม่ของ SQLite แต่ต่างจาก Postgres ตรงที่ jsonb ไม่ได้เป็นชนิดข้อมูลจริง ๆ มันเป็นรูปแบบที่ใช้รับเข้าและส่งออกในฟังก์ชัน jsonb* แบบ built-in เมื่อเก็บถาวรจริง ๆ แล้วจะเป็น blob ซึ่งเป็นหนึ่งใน 5 ชนิดพื้นฐาน
- ชนิดข้อมูลสำคัญมาก ๆ อื่น ๆ อย่าง
timestamptz ก็ไม่มีเช่นกัน ถ้าต้องการวันที่/เวลา ก็ต้องเก็บเป็น Unix timestamp แบบ integer หรือสตริงรูปแบบ ISO8601 และมีฟังก์ชัน built-in หลายตัวสำหรับจัดการงานเหล่านี้
- SQLite มีความสามารถด้านสตรีมมิงที่น่าประทับใจซึ่งผมอยากลองใช้ แต่ประสบการณ์ DX ช่วงแรกนั้นบอกได้เลยว่าค่อนข้างขรุขระ
- บางครั้งก็สงสัยว่าเราถูกยึดติดกับ narrative บางอย่างมากเกินไปหรือเปล่า เช่น Postgres คือฐานข้อมูลที่ดีที่สุดในโลกจริงไหม? ประสบการณ์ครั้งนี้ยิ่งทำให้ผมมั่นใจมากขึ้น ใช่, Postgres ดีที่สุด
6 ความคิดเห็น
ให้ความรู้สึกเหมือนต้องการ SQLHeavy มากกว่า SQLite นะ
มีฐานข้อมูลแบบนั้นบ้าง แบบนี้บ้างนะครับ ผมรู้สึกว่า SQLite ก็มีแนวทางการดำเนินไปตามปรัชญาของมันเอง
ทำไมถึงพยายามจะใช้ SQLite ให้เหมือน Postgres กันนะ?
มันให้ความรู้สึกเหมือนคนที่เพิ่งลองใช้ Linux ครั้งแรกแล้วบอกว่า “Hancom Office ก็ใช้ได้ไม่ดี เกมที่ฉันเล่นก็รันไม่ได้ ยังไงระบบปฏิบัติการก็ต้องเป็น Windows สิ!”
กระแสพูดถึง sqlite บน Hacker News มันจะเวอร์เกินไปหน่อยหรือเปล่า? ตั้งแต่ปี 2022 เป็นต้นมา มีโพสต์บน Hacker News จำนวนมากที่อ้างว่า sqlite สามารถมาแทนที่ RDBMS ที่รันแยกต่างหากได้
1: https://news.ycombinator.com/item?id=31318708
2. https://news.ycombinator.com/item?id=31152490
3. https://news.ycombinator.com/item?id=34812527
4. https://news.ycombinator.com/item?id=36208568
อื่น ๆ: https://hn.algolia.com/?dateEnd=1720854657&dateRange=custom&da…
ผมคิดว่าในกรณีที่รู้สึกว่าการใช้ผลิตภัณฑ์ฐานข้อมูลอย่าง Postgres หรือ MySQL นั้นเกินความจำเป็น SQLite ก็อาจเป็นทางเลือกที่น่าสนใจได้มากพอ
ยกตัวอย่างเช่น สำหรับบริการขนาดเล็ก ค่าใช้จ่ายของ managed DB อาจกลายเป็นกรณีที่ต้นทุนสูงเกินตัว และถ้าจะดูแลระบบเองก็ยังเป็นภาระอยู่ดี
ในทางกลับกัน SQLite ว่ากันว่าสามารถรองรับประสิทธิภาพได้เพียงพอในระดับหนึ่ง และโดยเฉพาะถ้าใช้เครื่องมืออย่าง Litestream ก็แทบไม่มีภาระในการดูแลระบบเลย จึงดูเหมือนว่าจะมีข้อดีอยู่มากครับ
ยังไม่ต้องไปถึงฟีเจอร์การทำ replication เลย แค่
sqliteก็สำรองข้อมูลง่ายอยู่แล้ว และขอแค่จัดการให้บริการเดมอนอยู่ในสถานะที่เหมาะสมก็พอ เลยถือว่าดีมาก แต่ถ้าจะเอาไปผูกกับ JPA ต้องทำโน่นทำนี่หลายอย่าง เลยรู้สึกว่าใช้ไม่ได้กับโปรเจกต์ที่ต้องส่งมอบงานต่อให้คนอื่นครับ ถ้ามีความตั้งใจจะจัดการ data schema ให้เข้มงวดกว่านี้เหมือนในต้นฉบับ มันก็ไม่ค่อยเหมาะกับการใช้งานแบบนั้นด้วยผมพิมพ์คอมเมนต์ก่อนหน้าไว้แต่ยังไม่จบ แค่อยากจะบอกว่ากระแสลือเกี่ยวกับ sqlite ทำให้เกิดภาพลวงตาราวกับว่า sqlite เป็นสารพัดนึกครับ