วันนี้พอดีไปอ่านเจอความเห็นใน narisa เลยเอามาแปะไว้สักหน่อยครับ
Question :
การออกแบบฐานข้อมูลแบบไหนดีกว่ากัน ระหว่างคอลัมน์เยอะ กับ join เยอะ
minimalist say :
หากเป็นตารางที่ใช้เพื่อ query ไปออกรายงาน แสดงว่า data operation (consumption) behavior คือ read
และกรณีที่ business logic ในการดึงข้อมูลและประกอบข้อมูลเพื่อออกรายงานไม่ซับซ้อนนักโซลูชั่น:
ออกแบบเป็นตารางเดียวไปเลยก็ได้
กำหนดกฏเกณฑ์ให้ตารางนี้มีแค่ read กับ insert พอ ไม่ควรให้ update และ delete ได้ ยกเว้น record มันเริ่มเยอะ และมี record ที่ไม่ได้ใช้หรือ obsolete ต่อการ read ไปออกรายงานเยอะ ก็ทำงาน backup เอาไว้ ทำได้หลายวิธี เช่น read แล้วเอาไปเก็บในตาราง backup หรือลง backup storage แต่ควรทำนานๆ ครั้ง พอ backup เสร็จค่อย delete ในตารางเดิม จะทำให้ตารางนี้ไม่มีการ update เด็ดขาด หากอยากอัพเดต ให้ delete ของเก่าแล้ว insert ใหม่ เพื่อคุม operation ให้มีแค่ read, insert, delete (นานๆ ครั้ง) ก็จะช่วยเรื่อง performance index ไม่ให้ drop นักได้
แยกตารางนี้ออกมาจากตารางที่ทำ transaction คือเป็นตารางที่เก็บ trasaction data ที่มีทั้ง insert, update, delete เพราะตารางแบบนี้มี movement สูง เป็นการ write มากกว่า read เราก็แยกตารางเพื่อ read กับ write ไปเลย จะเอาข้อมูลทรานแซกชั่นมาเก็บแบบ real time ก็ลงตารางทรานแซกชั่น ข้อมูลที่จะเอาไปออกรายงานก็เอาไปลงอีกตาราง ทำให้ช่วยลด concurrently access ได้
2 ตารางข้างต้นจะแยกไปเก็บยังดิสก์คนละตัวกันก็ได้ จะได้แยก I/O ได้อีก ช่วย performance ได้
query อย่าซับซ้อนเกินไป ดึงเป็นข้อมูลดิบแล้วเอาไปตบแต่งรูปแบบผลลัพธ์ต่อที่ระดับเซอร์วิสหรือแอพพลิเคชั่นก็ได้ เพื่อลดโอเวอร์เฮดของ database
สร้าง index ให้สัมพันธ์กับหน้าจอป้อนเงื่อนไขออกรายงาน อย่าให้ซับซ้อนนักทริกนะครับ: แยกให้ออกระหว่าง ข้อมูล กับ data presentation ถ้าเอา 2 เรื่องนี้โยนไปให้ database ทำ ก็จะซับซ้อนและเปลือง performance ได้



