59 คะแนน โดย xguru 2022-07-27 | 10 ความคิดเห็น | แชร์ทาง WhatsApp
  • ใช้มาประมาณ 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 ความคิดเห็น

 
triumph1 2024-10-02

ขอบคุณมากครับ/ค่ะ ที่ทำให้ได้รู้จัก edgedb เลยใช้งานได้อย่างดีอยู่ครับ/ค่ะ! ขอบคุณนะครับ/ค่ะ~

 
extremer 2022-08-27

ดูเหมือนว่าจะเดินไปในแนวทางคล้ายกับ prisma นะครับ ผมใช้ prisma ได้ดีอยู่ แต่ในแง่ประสิทธิภาพยังมีจุดที่น่าเสียดายอยู่เยอะ ผล benchmark เลยน่าสนใจขึ้นมานิดหน่อยนะ?
ไวยากรณ์ไม่ค่อยใช่สไตล์ผมเท่าไหร่..(ผมก็ใช้ protobuf อยู่เหมือนกัน แต่แม้แต่ sample code สำหรับ conversion ก็ยังแบบว่า...)

คนอื่น ๆ ชอบไวยากรณ์แบบ GraphQL กันแบบนี้ไหมครับ? สำหรับผมสุดท้ายฝั่งหลังบ้านก็คือ RDS อยู่ดี เลยต้องมีการแปลงอยู่ตรงกลาง ถ้ามันไม่ได้แสดงออกมาอย่างชัดเจนผมจะค่อนข้างไม่ค่อยอยากใช้เท่าไหร่..

 
dextto 2022-08-14

พอเห็นโพสต์นี้แล้วก็สนใจขึ้นมา เลยกำลังศึกษาอยู่เรื่อย ๆ
แต่เพราะยังอยู่ช่วงเริ่มต้นหรือเปล่า พอมีจุดที่ติดขัดก็ยังค้นหาเจอข้อมูลไม่มากนัก
แม้จะมีช่อง Discord อยู่แล้ว แต่คิดว่าน่าจะดีถ้านักพัฒนาในประเทศจะได้ถามตอบกันอย่างสะดวก เลยเปิดห้องแชตโอเพนขึ้นมาห้องหนึ่ง
https://open.kakao.com/o/gtGY0Gve

 
forteleaf 2022-07-29

ผมก็อยากลองใช้ดูเหมือนกัน เลยจดบันทึกเอาไว้ครับ

 
ryuheechul 2022-07-28

พอได้อ่านบทความนี้แล้วไปทำตามทิวทอเรียลจนจบ ก็ยิ่งรู้สึกว่าโดนโน้มน้าวมากขึ้นเลยครับ

 
yunyun0505 2022-07-28

น่าสนใจนะ กลับไปสู่โลกที่ไม่มี SQL ไม่ได้แล้วสินะ..

 
jujumilk3 2022-07-27

น่าสนใจนะ

 
nicewook 2022-07-27

น่าประทับใจมาก!

 
bbulbum 2022-07-27

ในกลุ่ม graphdb ผมสนใจ ArangoDB อยู่เหมือนกัน แต่คิดว่าคงต้องลองดู EdgeDB สักครั้งเหมือนกัน

 
xguru 2022-07-27

เป็นคำชมที่มากจริงๆ เขาบอกว่าจะประกาศ 2.0 ในวันที่ 28/7 เวลา 10:00 น. (PT)

EdgeDB 1.0 รีลีส
EdgeDB - ORDB โอเพนซอร์สยุคถัดไปสำหรับนักพัฒนา