เจอปัญหา N+1 อีกแล้ว

ระหว่างการ review code ของระบบงาน สิ่งที่พบเจอบ่อยมาก ๆ คือ N+1 problem ฟังแล้วอาจจะงง ๆ ว่าคืออะไร มาดูตัวอย่างกัน

การดึงข้อมูลจาก database/service

เมื่อต้องการข้อมูล product ว่ามี product ใหม่วันนี้มีอะไรบ้าง นั่นคือจะทำการดึงข้อมูล product 1 ครั้งมาจำนวน N product แต่สิ่งที่ product แต่ละตัวต้องการอีกคือ promotion และ stock ทำให้ต้องไปดึงข้อมูลของมาเพิ่มในแต่ละ product ถ้าเขียน code ง่าย ๆ จะทำแบบนี้

products = getNewProducts()
	for product in products {
	  promotion = getPromotionByProduct(product.id)
	  // TODO next
	}
	for product in products {
	  stock = getStockByProduct(product.id)
	  // TODO next
	}

น่าแปลกว่า จะเจอปัญหาแบบนี้เยอะมาก ๆ ที่สำคัญมักจะส่งผลต่อระบบงานในเชิงลบอย่างมาก และชอบแก้ไขด้วยการเพิ่ม CPU/MEMORY ของระบบอีกต่างหาก !! ทำไมนะ ?

0
397