วิธีทำ Incremental Extraction จากตารางที่ไม่มี Primary Key หรือพวก Date/Timestamp

คิดว่าหลาย ๆ คนน่าจะเจอปัญหาที่ตารางข้อมูลที่เราจะดึง ไม่มีทั้ง primary key (ที่เป็นแบบ incremental ที่เราสามารถ sort ได้นะ ไม่ใช่แบบ UUID) หรือแม้กระทั่ง date ให้เราเก็บไว้อ้างอิงตอนดึงข้อมูลได้เลย ซึ่งสุดท้ายก็จะโดนบีบบังคับให้ทำ full extraction ไปซะงั้น ซึ่งถ้ามีตารางที่ใหญ่มาก ๆ การทำ full extraction ก็จะเป็นปัญหาแน่นอน :sweat_smile:

ทางแก้? ที่ควรจะเป็นจริง ๆ คือ คุยกับฝั่ง 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 ได้แล้ว :partying_face:

ถ้า database ไหนไม่มี except ก็ลองหาวิธีบอกความแตกต่างระหว่างข้อมูลใน source กับ destination ดูครับ

จริง ๆ ยังมีวิธีอื่นอย่างเช่น change data capture (CDC) อีก แต่อันนี้ก็อาจจะไปเพิ่มความ complexity ให้ data pipeline เราแทน

1 Like