คิดว่าหลาย ๆ คนน่าจะเจอปัญหาที่ตารางข้อมูลที่เราจะดึง ไม่มีทั้ง primary key (ที่เป็นแบบ incremental ที่เราสามารถ sort ได้นะ ไม่ใช่แบบ UUID) หรือแม้กระทั่ง date ให้เราเก็บไว้อ้างอิงตอนดึงข้อมูลได้เลย ซึ่งสุดท้ายก็จะโดนบีบบังคับให้ทำ full extraction ไปซะงั้น ซึ่งถ้ามีตารางที่ใหญ่มาก ๆ การทำ full extraction ก็จะเป็นปัญหาแน่นอน
ทางแก้? ที่ควรจะเป็นจริง ๆ คือ คุยกับฝั่ง source system ครับ ว่าช่วยเพิ่ม column ที่เป็น primary key หรือ date (จะเป็น timestamp ก็ได้) เช่น created_date
หรือ created_at
เราจะได้ดึงข้อมูลเป็น chunk ๆ ได้ ถ้าเค้าสามารถเพิ่มให้ได้ อันนี้ชีวิตเราก็จะสุขสบาย
แต่… ถ้าเพิ่มไม่ได้ล่ะ?
ยังพอมีหนทางที่เรายังพอจะทำ incremental extraction ได้อยู่ นั่นก็คือการเปรียบเทียบความแตกต่างของข้อมูลระหว่างปลายทาง (destination) กับต้นทาง (source) นั่นเอง ถึงแม้ว่าครั้งแรกยังเป็น full extraction อยู่ แต่ครั้งถัด ๆ ไปเราก็ไม่ต้องดึงข้อมูลทั้งหมดล่ะ
เราสามารถใช้ except
ในภาษา SQL มาใช้ได้ประมาณนี้
select * from source
except
select * from destination;
แปลความได้ว่า ข้อมูลทั้งหมดที่อยู่ใน source แต่ไม่อยู่ใน destination นั่นเอง เท่านี้เราก็ทำ incremental extraction ได้แล้ว
ถ้า database ไหนไม่มี except ก็ลองหาวิธีบอกความแตกต่างระหว่างข้อมูลใน source กับ destination ดูครับ
จริง ๆ ยังมีวิธีอื่นอย่างเช่น change data capture (CDC) อีก แต่อันนี้ก็อาจจะไปเพิ่มความ complexity ให้ data pipeline เราแทน