- ใช้มาประมาณ 1 ปี และเปลี่ยนแทบทุกโปรเจกต์ที่เป็นไปได้มาใช้ EdgeDB
- EdgeDB คือ Graph/Relational DB ที่สร้างอยู่บน Postgres
→ ถึงจะใช้เอนจินเดิม แต่ในมุมผู้ใช้ทุกอย่างเปลี่ยนไปหมด การเปลี่ยนแปลงที่ใหญ่ที่สุดคือภาษาคิวรีและเครื่องมือ (Tooling)
ภาษาคิวรี
- EdgeDB ไม่มี SQL และใช้ภาษาของตัวเองชื่อ EdgeQL ซึ่งนี่แหละคือ game changer
- พอลองใช้แล้ว ก็ไม่อยากกลับไปใช้ SQL อีกเลย
→ มี type system ที่ทรงพลัง เป็นเชิงวัตถุ และทำ deep query ได้ง่ายมาก แถมยังสอดคล้องกับวิธีที่มนุษย์คิดเวลา query ข้อมูล (เพราะคนเราไม่ได้คิดเป็นการ JOIN กัน) - ก่อนหน้านี้ก็ไม่ได้เป็นแฟนของ SQL อยู่แล้ว แต่ในความเป็นจริงมันไม่มีตัวเลือกอื่น
- พอได้เรียนและลองใช้อยู่ไม่กี่วันพร้อม tutorial สไตล์หนังสือที่ยอดเยี่ยม ก็พบว่าการทำ DB schema modeling กลายเป็นเรื่องสนุกและเบาสบาย
→ ความซับซ้อนของ SQL หายไป และทำให้รู้ว่า SQL ในฐานะภาษาคิวรีนั้นทั้งไม่มีประสิทธิภาพและประหลาดแค่ไหน - EdgeQL เรียนรู้ง่าย และแค่อ่าน quickstart กับ overview ก็เข้าใจได้ราว 80%
- ฉันชอบ EdgeQL มากจนอยากให้มันกลายเป็นมาตรฐานอิสระไปเลย เช่น อยากเห็นอะไรอย่าง EdgeDBLite ที่ใช้ EdgeQL กับ file-based DB ได้
Tooling
- ใช้แนวทางสมัยใหม่ที่มีไบนารีเดียวรันได้ทุกอย่าง (เหมือน Go หรือ Flutter)
→ ทั้งติดตั้งและอัปเดตเซิร์ฟเวอร์, สร้าง/ลบ DB, REPL, migration, backup และการจัดการโปรเจกต์
→ และในกรณีส่วนใหญ่ "It Just Works" - EdgeDB คิดใหม่เรื่องวิธีที่เราโต้ตอบกับ DB
→ ด้วยคอนเซปต์ "Project" มันเชื่อมต่อ DB ให้อัตโนมัติ จึงใช้งานได้เลยโดยไม่ต้องสนใจ DSN หรือการตั้งค่า
→ เทียบกับการต้องตามหา SQL command ที่ถูกต้องเป๊ะเพื่อให้สิทธิ์ root access บน localhost มานานเกิน 10 ปีแล้ว มันสดชื่นมาก
ความสามารถต่าง ๆ
- การทำโมเดลความสัมพันธ์ many-to-many ที่ง่ายมาก
- GraphQL แบบฝังในตัว (เชื่อมตรงจากฝั่ง frontend ได้)
- computed property
rating := math::mean(.ratings.score) - backlinks : ไล่หาลิงก์ย้อนกลับ
→select User.<author;ค้นหาจากตารางที่เชื่อมกับ User ผ่านฟิลด์ชื่อ author - uuid, collection, scalar, abstract และ type อื่น ๆ อีกหลายแบบ (ของโปรดของฉันคือ cal::local_datetime)
- ของโหดอย่าง inheritance, constraints และ introspection
ประสบการณ์จนถึงตอนนี้
- เริ่มใช้มาตั้งแต่ราว 1 ปีก่อน ตอนแรกย้ายโปรเจกต์ส่วนตัวเล็ก ๆ มาก่อน แล้วค่อยย้ายหนึ่งในโปรเจกต์ของบริษัท
- งานส่วนใหญ่ของฉันเป็นบริการขนาดเล็กที่ใช้งานได้จริงสำหรับผู้ใช้ และหลายครั้งก็รับผิดชอบคนเดียว เลยมีความหรูหราที่จะเลือกเครื่องมือที่เหมาะที่สุดได้
- ตลอดเวลาที่ใช้ EdgeDB ส่วนใหญ่เป็นประสบการณ์แบบ "It Just Works"
- ของส่วนใหญ่หาได้ง่าย และเอกสารก็ดีมากจนค้นหาสะดวก (พูดจริง ๆ ว่านี่เป็นหนึ่งในเว็บเอกสารที่ดีที่สุดเท่าที่เคยเห็น)
เหมาะกับ production ไหม
- ใช้ "ใน production" มาตั้งแต่ฤดูใบไม้ร่วงที่ผ่านมา
- บางคนอาจให้น้ำหนักกับคำว่า "ใช้ใน production" มากกว่าแค่ "มีการใช้งานจริง" อยู่บ้าง แต่ก็เถอะ..
- ตอนที่เครื่องมือ command line ถูก refactor ก็ต้องแก้สคริปต์ automation เล็กน้อย แต่ไม่ใช่เรื่องใหญ่
- ในใจเตรียมรับความเสี่ยงในฐานะ early adopter ไว้อยู่แล้ว แต่จนถึงตอนนี้ยังไม่มีปัญหาอะไร
พลังในการแสดงออกของ EdgeQL
- มันปลดปล่อยฉันจากการต้องคอย google เรื่อง SQL และหาข้อจำกัดของ ORM รวมถึงวิธีเลี่ยงมัน
- EdgeQL ทำให้ฉันเขียนสิ่งที่อยากดึงจาก DB ได้ตรงเป๊ะ และยังอ่านรู้เรื่องจริง ๆ (นักพัฒนาคนอื่นก็อ่านเข้าใจได้)
- บางครั้ง EdgeQL ยังช่วยให้หลีกเลี่ยง transaction ได้ด้วย เพราะทำ nested update หลายชั้นใน query เดียวได้
→ "Simplicity is complicated"
Migrations
- หนึ่งในสิ่งที่เจ๋งที่สุดคือมีระบบ migration ในตัว
- เปลี่ยน schema แล้วเรียก
edgedb migration createก็จะได้ไฟล์ migration ขึ้นมา และ
บนเซิร์ฟเวอร์ก็แค่รันedgedb migration applyก็ใช้งานได้ทันที - migration ถูกเชื่อมกันด้วย hash จึงไม่มีทางเผลอ apply แบบสุ่มเพียงตัวเดียวจนพังทั้งระบบ
- ตอนสร้าง migration ใหม่ ค่าปริยายจะเป็นแบบ interactive โดยให้ยืนยันทุกการเปลี่ยนแปลงผ่าน command line
ประสิทธิภาพ
- ฉันไม่ได้จัดการข้อมูลขนาดใหญ่มาก จึงไม่ได้ต้องการ DB ที่แรงระดับสูงสุด
- แต่เพราะด้านล่างใช้ Postgres อยู่แล้ว จึงไม่ได้มีปัญหาเรื่องประสิทธิภาพเมื่อเทียบกับ DB อื่น
- ตัว EdgeDB เองเขียนด้วย Python (ถ้าเป็น Go ก็คงดี แต่ดูเหมือนนักพัฒนาจะคุ้นกับ Python มากกว่า)
Go client library
- เพราะฉันใช้ Go จึงดีมากที่มีไลบรารี Go แบบ native สำหรับ EdgeQL
- มีไลบรารีทางการสำหรับ Typescript/Javascript, Python และ Go ส่วน .Net กับ Elixir มีชุมชนช่วยดูแล
การอัปเกรด
- EdgeDB ทำให้ความซับซ้อนเรื่องเวอร์ชันและการอัปเดตของเซิร์ฟเวอร์ถูกซ่อนอยู่เบื้องหลัง
- โดยพื้นฐานแล้ว EdgeDB CLI จัดการให้เอง ถ้ามีอัปเดตใหม่ก็จะแจ้งและอัปเกรดให้
→ ลื่นไหลจนน่าสงสัย - ตอนนี้มี 2.0 RC ออกมาแล้ว แต่ไม่ได้กังวลเลย เพราะประสบการณ์ที่ผ่านมาเชื่อได้ว่ามันจะปลอดภัยและง่าย
การสื่อสารและการสนับสนุน
- ในฐานะ early adopter ฉันพอใจกับการได้รับคำตอบและความช่วยเหลืออย่างรวดเร็วมากจากช่องทางทางการของ EdgeDB
EdgeDB 2.0
- เวอร์ชัน 2.0 ที่จะปล่อยพรุ่งนี้มีฟีเจอร์ดี ๆ เพิ่มเข้ามา
- EdgeDB UI : เว็บแอปที่มี visual schema editor, REPL และอื่น ๆ
- group query, global schema variable, ความปลอดภัยระดับ object และ Direct EdgeQL over HTTP เป็นต้น
สิ่งที่ฉันไม่ชอบหรือกังวล
- คำมั่นเรื่อง compatibility
- จนถึงตอนนี้ทุกอย่างดีมาก มี minor update ที่ไม่ทำให้ compatibility พัง
- ถ้ามี commitment เรื่อง compatibility ที่ชัดเจนก็น่าจะดี
- ชุดฟีเจอร์ที่เพิ่มขึ้นเรื่อย ๆ
- ตอนนี้ก็มีฟีเจอร์มากกว่าที่ฉันต้องการแล้ว และก็ยังเพิ่มขึ้นเรื่อย ๆ
- ยิ่ง EdgeQL ทรงพลังขึ้น ก็ยิ่งทำให้เส้นแบ่งระหว่าง DB กับเซิร์ฟเวอร์พร่าเลือน จนต้องคิดว่า "สิ่งนี้ควรอยู่ใน backend หรือใส่ไว้ใน DB schema อัจฉริยะดี"
- การใช้ embedded HTTP server แล้วผลักไปสู่แนวทางที่แทนที่ backend server ทั้งหมดในโปรเจกต์ส่วนใหญ่ก็ดูสมเหตุสมผล แต่.. ฉันแค่อยากได้ DB ที่เสถียรพร้อมภาษาคิวรีและเอนจินที่ยอดเยี่ยมนี้
- ยังไงก็ตาม ฉันหวังว่า EdgeDB จะยังคงเสถียรและสม่ำเสมอ โดยไม่ขยายฟีเจอร์มากเกินไป เพราะชุดฟีเจอร์ปัจจุบันก็ดีเยี่ยมอยู่แล้ว
สรุป
- สำหรับโปรเจกต์ต่อ ๆ ไป ฉันไม่คิดจะพิจารณา RDB แบบเดิมอีกแล้ว
- การกลับไปใช้ SQL ก็เหมือนกับจาก Flutter ย้อนกลับไปใช้ Ncurses หรือจาก Go ย้อนกลับไปใช้ภาษาแอสเซมบลี
- สำหรับฉัน EdgeDB คือความก้าวหน้าครั้งใหญ่ที่สุดของวงการ DB ในรอบ 20 ปี
- ต่อให้ในอนาคตอาจเปลี่ยนความคิดเมื่อมีประสบการณ์มากขึ้น แต่หลังจากใช้มานานกว่าหนึ่งปี ก็ยังไม่มีอะไรลดทอนความสุขนี้ได้เลย
- ยิ่งใช้ก็ยิ่งเชื่อมั่นใน EdgeDB
- ทุกอย่างที่ทีม EdgeDB ทำ ไม่ว่าจะเป็นตัว EdgeDB เอง ภาษา เว็บไซต์ เครื่องมือ หรือชุมชน ล้วนสร้างความประทับใจอย่างมาก
→ "Mad respect to the team" - และดูเหมือนว่าพวกเขาเพิ่งจะเริ่มวอร์มอัปเท่านั้น
10 ความคิดเห็น
ขอบคุณมากครับ/ค่ะ ที่ทำให้ได้รู้จัก edgedb เลยใช้งานได้อย่างดีอยู่ครับ/ค่ะ! ขอบคุณนะครับ/ค่ะ~
ดูเหมือนว่าจะเดินไปในแนวทางคล้ายกับ prisma นะครับ ผมใช้ prisma ได้ดีอยู่ แต่ในแง่ประสิทธิภาพยังมีจุดที่น่าเสียดายอยู่เยอะ ผล benchmark เลยน่าสนใจขึ้นมานิดหน่อยนะ?
ไวยากรณ์ไม่ค่อยใช่สไตล์ผมเท่าไหร่..(ผมก็ใช้ protobuf อยู่เหมือนกัน แต่แม้แต่ sample code สำหรับ conversion ก็ยังแบบว่า...)
คนอื่น ๆ ชอบไวยากรณ์แบบ GraphQL กันแบบนี้ไหมครับ? สำหรับผมสุดท้ายฝั่งหลังบ้านก็คือ RDS อยู่ดี เลยต้องมีการแปลงอยู่ตรงกลาง ถ้ามันไม่ได้แสดงออกมาอย่างชัดเจนผมจะค่อนข้างไม่ค่อยอยากใช้เท่าไหร่..
พอเห็นโพสต์นี้แล้วก็สนใจขึ้นมา เลยกำลังศึกษาอยู่เรื่อย ๆ
แต่เพราะยังอยู่ช่วงเริ่มต้นหรือเปล่า พอมีจุดที่ติดขัดก็ยังค้นหาเจอข้อมูลไม่มากนัก
แม้จะมีช่อง Discord อยู่แล้ว แต่คิดว่าน่าจะดีถ้านักพัฒนาในประเทศจะได้ถามตอบกันอย่างสะดวก เลยเปิดห้องแชตโอเพนขึ้นมาห้องหนึ่ง
https://open.kakao.com/o/gtGY0Gve
ผมก็อยากลองใช้ดูเหมือนกัน เลยจดบันทึกเอาไว้ครับ
พอได้อ่านบทความนี้แล้วไปทำตามทิวทอเรียลจนจบ ก็ยิ่งรู้สึกว่าโดนโน้มน้าวมากขึ้นเลยครับ
น่าสนใจนะ กลับไปสู่โลกที่ไม่มี SQL ไม่ได้แล้วสินะ..
น่าสนใจนะ
น่าประทับใจมาก!
ในกลุ่ม graphdb ผมสนใจ ArangoDB อยู่เหมือนกัน แต่คิดว่าคงต้องลองดู EdgeDB สักครั้งเหมือนกัน
เป็นคำชมที่มากจริงๆ เขาบอกว่าจะประกาศ 2.0 ในวันที่ 28/7 เวลา 10:00 น. (PT)
EdgeDB 1.0 รีลีส
EdgeDB - ORDB โอเพนซอร์สยุคถัดไปสำหรับนักพัฒนา