Migrate Firestore to Supabase

Chaiyapod Tuntimanigun
Athena Official
Published in
4 min readJan 6, 2023

สวัสดีครับ ทุกคนคงรู้จัก Firebase กันมาบ้างแล้ว Firebase ก็ถือว่าเป็น Cloud service provider เจ้านึงที่มี Service ให้เลือกใช้มากมาย ทั้ง Authentication, Database (Firestore), Hosting และ Service อื่นๆอีกเยอะแยะ แถมยังมี Dashboard ให้ดูอีกด้วย ซึ่งบทความนี้จะขอพูดถึงแค่ Firestore

เกริ่นนำก่อนว่า Firestore ก็เป็น Database แบบ NoSQL ตัวนึง ข้อดีของมันคือการ Setup project ที่ง่าย แถมยังมีความรวดเร็วในเชิงของการ Query ข้อมูล ที่สำคัญคือราคาค่อนข้างถูกเลยทีเดียวใครที่เคยใช้มาก่อน คงจะรู้ถึงข้อดีของ Firestore อีกมากมาย

ในบทความนี้เราจะขอมาแชร์ข้อเสีย หรือปัญหาที่เราเจอมาใน Firestore กันบ้างครับ

คือ การทำ Relation ของ Firestore มันเหมือนเป็นการทำ Relation ปลอมๆ เมื่อเราต้องเข้าถึงข้อมูลที่ Relate กัน เราจำเป็นต้องดึงข้อมูลแบบ Manual เอง และเมื่อข้อมูลมี Relation ที่เยอะมากขึ้น Code เราก็เยอะขึ้นและรกขึ้นเช่นกัน ซึ่งการดึงข้อมูลก็ลำบากมากขึ้นเรื่อยๆ เราเลยเริ่มมองหา Solution หรือ Database ตัวใหม่ที่จะมาแก้ปัญหานี้ได้

ทีนี้มาเข้าสู่เนื้อหาหลักของเราแล้ว เมื่อเราตัดสินใจกันแล้ว ว่าจะย้ายออกจาก Firestore เลยเริ่มมองหา Database ตัวใหม่ ซึ่ง Key factor ที่เรานำมาเปรียบเทียบมีดังนี้

  • Pricing
  • Retrieve related data
  • Migrate
  • Performance

ต้องบอกว่า Key สำคัญที่ทำให้เราตัดสินใจย้ายออกจาก Firestore คือ Retrieve related data

ให้เราลองจินตนาการว่า เรามีข้อมูลอยู่ 3 Columns คือ A, B และ C ที่ Relate กันตามลำดับ ตามนี้ A -> B -> C และ เนื่องจาก NoSQL นั้นเป็น Relation ปลอม การเก็บข้อมูลเราจึงต้องเก็บดังนี้

  • เก็บ Id ของ B ไว้ใน Column A
  • เก็บ Id ของ C ไว้ใน Column B

Pain point ของเราเลย คือเมื่อเราต้องการข้อมูลใน C การเขียนโค้ดจึงต้องทำเป็นทีละ Step ดังนี้

  1. Query column A
  2. นำ Id ของ B ที่เก็บอยู่ใน A ไป Query column B
  3. นำ Id ของ C ที่เก็บอยู่ใน B ไป Query column C

ซึ่งทั้งหมดที่กล่าวมา เป็นปัญหาที่เราเจอเมื่อใช้ Firestore แต่ปัญหานี้จะหมดไปเมื่อเราย้ายมาใช้ Database แบบ SQL นั้นจึงเป็น Key factor สำคัญที่เราย้ายออกจาก Firestore เราเลยเลือกที่จะมองหา Database แบบ SQL

ก็ได้มาเจอพระเอกของเราก็คือ Supabase

Supabase

Supabase ก็คือ Cloud service อีกตัว ที่มีความคล้ายกับ Firebase อย่างมาก เรียกได้ว่า Firebase มีอะไร Supabase ก็มีแบบนั้นเลยก็ว่าได้ เป็นพี่น้องฝาแฝด

ความแตกต่างของมันที่เราจะใช้ประโยชน์ก็คือ ประเภทของ Database โดยตัว Supabase จะให้ Database มาแบบ SQL ซึ่งก็คือเจ้า Postgres ที่กำลังเป็นที่นิยมนั้นเอง

และที่เราตัดสินใจเลือกเจ้า Supabase เพราะมีความคล้ายคลึงกับ Firebase อย่างมาก ทั้ง Service ต่างๆที่มีให้เลือกใช้ และที่สำคัญ Supabase เองมี Script สำหรับ Migrate ข้อมูลจาก Firestore มายัง Supabase ให้อยู่ใน Document ของเขาเอง ทำให้มีความน่าเชื่อถือระดับนึงโดยเราแค่ทำตาม Guidline ของ Supabase

*บทความนี้จะไม่ได้ลงลึกถึง Step by step เนื่องจากมี Document มาให้อ่านระดับนึงแล้ว แต่จะมาช่วย Guide ส่วนที่น่าจะติดปัญหาจากการอ่าน Document มากกว่า

ขั้นตอนในการ Migrate หลักๆมีทั้งหมด 4 Step

  • Step 1 Clone script repo
  • Step 2 Setup credential
  • Step 3 Run script transform Firestore to JSON file
  • Step 4 Run script import JSON file to Supabase

4 Step ด้านบน ถ้าดูจาก Document แล้ว คิดว่าทุกคนคงทำตามกันได้ไม่ยาก แต่ในบทความนี้ เราตั้งใจจะมาแชร์การทำ 6 Step ถัดไปในด้านล่าง คือปัญหาที่จะเจอระหว่างการทำตาม Document

Step 1

ให้เราไป Clone repo ของ Supabase มาก่อน ซึ่งเป็น Tools ที่จะช่วยเรา Migrate

เมื่อ Clone มาเราจะเห็นว่าจริงๆมันก็คือ Script ธรรมดา ถ้าอยากจะเขียนเอง ก็สามารถทำได้ แต่ก็ต้อง Handle หลายๆเรื่องเอง ซึ่ง Script ตัวนี้ก็ต้องบอกว่า จัดการมาให้ระดับนึงแล้ว

Step 2

จริงๆเท่านี้ก็ต้องบอกว่า สามารถ Migrate แบบเบื้องต้นได้แล้ว ซึ่งก็สามารถทำตาม Document นี้ได้เลย

Step 3

จาก Document จะเห็นว่า เราสามารถเขียน Custom hooks สำหรับจัดการข้อมูลแต่ละ Field ได้ว่า จะ Transform ไปหน้าตาแบบไหน หรือไป Column ไหนได้

จาก Document บอกว่า ถ้าต้องการ Custom hooks ให้สร้าง File javascript ให้ชื่อไฟล์ตรงกับชื่อ Collection เช่น มี Collection ชื่อ User ก็ให้สร้าง File user.js

เมื่อลอง Run command node firestore2json.js <collectionName> แล้วจะพบว่า Custom hook ที่เราเขียน ไม่ได้ถูกเรียกทำงาน

วิธีแก้ไขคือ ให้เปลี่ยนชื่อ Custom hook file ตามด้วย _processDocument จะได้เป็น user_processDocument.js

เพราะว่าถ้าเราไปดูที่ firestore2json.js file ที่ command เรียกใช้ จะสังเกตเห็นว่า

firestore2json.js

บรรทัดที่ 43 จะมองหาที่ Argument ตัวแรก + _processDocument.js จึงเป็นที่มาว่าทำไมต้องเปลี่ยนชื่อ Custom hooks file

*หรือเราจะเปลี่ยนบรรทัดที่ 43 และ 45 เป็น .js เฉยๆก็ทำได้

Step 4

ลอง Run command node firestore2json.js user อีกรอบ เพียงเท่านี้ก็จะได้ JSON file ที่ถูกเรียกผ่าน Custom ในการ Transform data แล้ว

Step 5

จากนั้นให้ Run command node json2supabase.js พร้อมกับใส่ Argument

  • JSON file name
  • Primary key strategy
  • Primary key name

เท่านี้ก็เป็นอันเสร็จสิ้นการ Migrate Firestore to Supabase เรียบร้อยครับ แต่ยังไม่ได้ข้อมูลที่เป็น Relation นะครับ

Step 6

การ Migrate เมื่อกี้เป็นแค่การย้ายข้อมูลมาเท่านั้น การสร้าง Foreign key ต้องไปสร้างมือที่ Supabase เอง หรือจะใช้ Script SQL เองอีกทีนึง แล้วแต่ตามที่แต่ละคนถนัดเลยครับ

เท่านี้ก็ถือว่า สามารถย้ายข้อมูลจาก Firestore มา Supabase ได้อย่างสมบูรณ์แล้ว

แต่แน่นอนว่า ระหว่างการ Migrate ด้วย Tools ที่ Supabase มีให้ ก็ยังเจอปัญหาของ Script json2supabase.js

เมื่อเรา Run script json2supabase.js โดย Data size เรามีมากกว่า 100 ชุดขึ้นไป เมื่อเราเริ่ม Execute ข้อมูลที่ลง Database จะเห็นว่า มันทวีคูณมาเป็น สิบกว่าเท่า วิธีแก้ให้เราไปที่ไฟล์ json2supabase.ts ย้ำว่า .ts นะครับ แล้วให้เสริชหา loadData() จากนั้น commend condition ถ้า insertRows.length ≥ 100 ทั้งหมด

json2supabase.ts

จากนั้นให้ Compile file json2supabase.ts ไปเป็น .js ก็จะเห็นว่า สามารถ Import data ลง Supabase ได้ถูกต้อง

เพราะถ้าสังเกตจาก Code ใน Function หรือรูปด้านล่างจะเห็นว่า บรรทัดที่ 259 นั้นก็มีการเรียก Function runSQL() อีกซึ่งเป็น Function ที่ใช้ Insert ข้อมูล ถ้าเราไม่ commend condition บรรทัดที่ 247 ก็จะเกิดการทำงานที่ซ้ำซ้อนกันนั้นเอง

json2supabase.ts

Summary

จากที่เล่ายืดยาวข้างบนมาแล้ว เราจะขอสรุปสั้นๆง่ายๆ เหตุผลที่เราเลือกจะย้ายมา SQL เพราะว่าการ Query ที่เริ่มจะลำบากขึ้นเรื่อยๆ และเริ่มเห็นว่าในอนาคต Data ของเรานั้นจะมีความเป็น Relation มากขึ้น

และเจ้า Supabase ก็ตอบโจทย์เรา ประทับใจมากๆกับการย้ายมา Supabase ทั้งการเก็บข้อมูลแบบ SQL ทำให้ Query ข้อมูลง่ายขึ้น จัดการกับ Relation ง่ายขึ้น แถมยังสามารถ Migrate จาก Firestore มาได้แบบสะดวกสบายอีกด้วยครับ ในอนาคตสามารถที่จะย้ายออกจาก Firebase 100% ก็ทำได้ และยังมี Script migrate ให้เลย และ Setup project ก็ง่ายมากๆ

จากที่ใช้งานมาระยะนึงข้อเสียของ Supabase ที่เห็นได้ชัดเลย คือ GUI ของ Database viewer นั้นค่อนข้างช้า และดูเหมือนจะเกิด Error ที่ไม่ทราบสาเหตุบ่อยครั้ง หากเราต้องการดู Database ผ่าน GUI ของ Supabase เลย แนะนำให้ดูผ่าน Database viewer ตัวอื่นจะ Stable กว่ามาก นอกจากเรื่องนี้แล้ว ทุกอย่างก็ดูปกติดี ใช้งานสะดวกสบาย

หวังว่าบทความนี้จะช่วยลดเวลาของคนกำลังจะ Migrate แล้วเจอ Error แปลกๆ ไม่รู้จะแก้ยังไง สุดท้ายใครมี Trick เพิ่มเติม หรือท่าในการทำ ท่าอื่นก็อยากให้เพื่อนๆมาแชร์ความรู้กันครับ ถ้าอนาคตเจออะไรที่น่าสนใจ เรามาเจอกันในบทความหน้าแน่นอนครับ

--

--