วันเสาร์ที่ 27 มิถุนายน พ.ศ. 2552

db AND dw

Data Warehouses คือ collection ของ data ที่เอาไว้ใช้สนับสนุนการตัดสินใจ โดย Data Warehouse ที่ว่านี้จะต้องเป็น:

  • Subject Oriented ให้มองว่าปกติแล้วในระบบ Operation มันจะเป็น Application Oriented เช่น ระบบคลังสินค้า มันก็จะว่าด้วยเรื่องของการซื้อสินค้าเข้าคลัง ย้ายสินค้าออกคลัง, ส่วนระบบจัดซื้อก็จะว่าด้วยเรื่องที่ว่าเราจัดซื้ออะไรบ้าง แต่ว่าในแต่ละระบบมันก็จะมี data เฉพาะของมันเอง แต่ถ้าในเรื่องของ data warehouse แล้วเราจะไม่ได้มองเป็น application ใดๆแบบที่ได้กล่าวมา แต่เราจะมองว่า ข้อมูลที่เรามีอยู่แล้ว เราจะเอาไปวิเคราะห์เพื่ออะไร เช่นวิเคราะห์ผลกำไรขององค์กร เป็นต้น ดังนั้นข้อมูลที่จะอยู่ใน warehouses ของเรา มันจะต้องเป็นข้อมูลที่ดึงมาจาก application ต่างๆเอามารวมกัน ซึ่งถ้าเป็นแบบนั้นแล้ว เราจะไม่ออกแบบข้อมูลเป็น application oriented แต่เราจะออกแบบข้อมูลเป็น subject oriented ซึ่งคำว่า subject oriented ในที่นี้ก็คือว่า เป้าหมายของเราอยู่ที่ไหน เราก็จะออกแบบข้อมูลเพื่อไปตอบเป้าหมายของเราที่อยู่ตรงนั้น เราไม่ได้ออกแบบข้อมูลตาม application ในขณะที่ database ทั่วๆไปมันจะออกแบบโครงสร้างข้อมูลตาม application นั้นๆ และแน่นอนข้อมูลที่เราเอามาเก็บใน data warehouses ก็มักจะเป็นข้อมูลที่ถูกดึงมาจากหลายๆ application และเมื่อข้อมูลมาจากหลายๆแหล่ง ข้อมูลก็มักจะต้องมีความขัดแย้งกัน และข้อมูลที่ถูกดึงเข้ามาก็มักจะมีข้อมูลเกี่ยวกับเวลาเข้ามาเกี่ยวข้องด้วย (จริงๆข้อมูลจะมีเวลากำกับอยู่เสมอ) เนื่องจากเป็นการเก็บข้อมูลแบบพอกพูนเพิ่มขึ้นเรื่อยๆ ไม่ได้ลบทิ้งออกไป
  • Non-Volatile Data เราจะไม่ได้ลบข้อมูลเก่าออกไป ดังนั้นข้อมูลมันจะไม่มีวันสูญหาย (โดย concept)

Data Warehouse VS Traditional Database

ในที่นี้ เราจะมองในเรื่องของลักษณะข้อมูล การโปรเซส ลักษณะการใช้งาน และการออกแบบ

Data warehouse

  • Subject-Oriented
  • เป็นข้อมูลที่เก็บสะสมไปเรื่อยๆ แต่โดยมากแล้ว ยังไม่ได้เก็บข้อมูลของปัจจุบันยัง ณ ตอนนั้นโดยทันที แต่จะรอจนกว่าจะถูกสั่งให้ดึงข้อมูลเข้ามา
  • ข้อมูลเป็น static มีแต่ข้อมูลใหม่เพิ่มเข้ามา ข้อมูลเดิมไม่มีการเปลี่ยนแปลง
  • Transaction จะเป็นแบบการดึงข้อมูลเป็นจำนวนมาก และเอามาวิเคราะห์แบบซับซ้อน และเรามักจะไม่รู้ว่าวันนี้เราจะวิเคราะห์อะไร (แล้วแต่ผู้บริหารว่าอยากจะรู้อะไร) เวลาจะวิเคราะห์แต่ละครั้ง ปกติมันก็ต้องไปยุ่งกับข้อมูลจำนวนมาก ทำให้เราพยายามหลีกเลี่ยงไม่ให้เกิดการ Join ตารางกัน และพยายามจะไม่ normalize มัน โดยสิ่งที่เราจะมองหลักๆคือ เราจะทำยังไงให้มันดึงข้อมูลออกมาได้ง่าย และเร็ว
  • มีเพียงไม่กี่คนที่เข้ามาใช้ แต่ว่าแต่ละครั้งที่ใช้จะ take processing power จำนวนมาก

Traditional Database

  • Application-Oriented
  • ข้อมูลปัจจุบันในฐานข้อมูล จะเปลี่ยนแปลงเรื่อยๆ
  • Transaction จะเป็นแบบสั้นๆ ง่ายๆ ซ้ำๆ และเกิดบ่อยๆโดยการอ่านไม่กี่ record ในฐานข้อมูล
  • ปกติจะมีคนใช้เยอะ และกิน processing น้อย

เนื่องจาก 2 แบบที่กล่าวมานี้ จะเห็นว่าลักษณะการใช้งานแตกต่างกัน ทำให้เราต้อง configure database ต่างกัน รวมทั้งการออกแบบ database ก็จะต่างกันด้วย

Problem in Building Data Warehouses

ปัญหาที่เห็นชัดๆเลยก็คือในเรื่องของ Data homogenization: บางที เราเอาข้อมูลที่มีธรรมชาติต่างๆกัน จากหลายๆแหล่งมารวมกัน บางทีมันรวมกันลำบาก และเพื่อให้มันรวมกันได้ เราจำเป็นต้องตัดส่วนที่มันต่างกันออกไป ทำให้เราเสียความเป็นความเฉพาะเจาะจงของข้อมูลออกไป มันก็เลยเป็นปัญหาว่า ถ้าเราอยากจะวิเคราะห์ข้อมูลข้ามหลายๆเรื่อง บางทีทำให้เราต้องตัดรายละเอียดออกไปบ้าง เพื่อให้ข้อมูลสามารถเข้ากันได้ เช่นเราเอาข้อมูลจากหลายๆแหล่งมาลงในตารางเดียวกัน บางทีมันทำไม่ได้ เพราะ attribute มันไม่เหมือนกันจะลงตารางเดียวกันได้ไง ทำให้เราต้องตัดให้เหลืิอส่วนที่มันเหมือนกันเท่านั้น ถึงจะเอามาลงตารางเดียวกันได้

ตอนต่อไปจะว่าด้วย Components ต่างๆของ Data warehouse

Related Link from Roti

Database AND data warehouse

Database นั้นในปัจจุบันไม่ว่าจะค่ายไหนไม่ว่าจะเป็น open source (ฟรี) หรือ commercial (ธุรกิจ) ต่างก๋จะใช้โครงสร้างข้อมูลที่เป็นแบบ Relational คือลักษณะเป็นแบบตารางที่ประกอบไปด้วย field
โดย field หมายถึงข้อมูลดิบหนึ่งชุดโดยธรรมชาติจะไม่ได้อยู่เดี่ยวๆแต่จะนำมันรวมกันเป็นกลุ่มข้อมูลซึ่งข้อมูลที่เรียงกันเราจะเรียกว่า 1 record
โดยแต่ละหนึ่ง record นั้นจะถูกนำมารวมกันไว้ในที่เดียวเรียกว่า Table ..........


IPB Image

ซึ่งจะเห็นว่าข้อมูลนั้นจะถูกเก็บอยู่ในลักษณะ 2 มิติซึ่งการเก็บลักษณะนี้เหมาะสำหรับการเก็บข้อมูลที่ไม่เยอะมากเพราะว่าเมื่อมีข้อมูลเยอะมากๆแล้วการทำการค้นหาข้อมูลก็จะยิ่งยากขึ้น
แต่ว่าใน ฐานข้อมูล ที่มีชื่อเสียงนั้นก็จะมีวิธีการที่ทำให้การเข้าถึงข้อมูลเร็วขึ้นคือการแบ่ง table (partition table) คือจะแบ่งข้อมูลออกมาเป็นชิ้นเพื่อให้เวลาค้นหานั้นทำได้ง่ายขึ้นโดย เช่น เราอาจจะตั้งให้ table ของเรานั้นแบ่งข้อมูลตามเดือนโดยพอครบหนึ่งเดือนแล้วเราอาจจะสั่งให้เก็บลงในตารางเสมือนที่สร้างขึ้นมาเพื่อเก็บข้อมูลในเดือนใหม่เข้าเพื่อที่จะแบ่งแยกข้อมูลเพื่อให้เวลาค้นหาข้อมูลได้เร็วขึ้น ซึ่งที่บอกว่ามันเป็นตารางเสมือนนั้นเพราะว่าผู้ใช้ไม่จะมองเห็น table ที่ทำการแบ่ง partition นั้นเป็นเหมือนแค่ 1 table โดยหน้าที่ในการแบ่งจะให้ database เป็นผู้ทำเอง

แต่ว่าการแบ่ง table นั้นนอกจากจะแบ่งตามระยะเวลาอาจจะแบ่งตามประเภทได้ด้วย เช่น ประเภทของลูกค้า, ประเภทของผู้ให้บริการ เป็นต้น

IPB Image

ในตัวอย่างนี้เรายก table Order มาดูกันโดย Order(การสั่งซื้อ) โดยในเดือนเดือนนึงนั้นสมมติว่ามีการสั่งซื้อเข้ามาเยอะดังนั้นประสิทธิภาพของ table จะแปรผันกับข้อมูลที่อยู่ใน table ยิ่งข้อมูลใน table ยิ่งเยอะจะทำให้ประสิทธิภาพลดลงเพราะว่าเวลาในการค้นหาข้อมูลหรือการจัดการข้อมูลก็จะนานขึ้น แต่ว่าถ้าเรามีการจัดการ table โดยการทำ partition table นั้นจะทำให้เราสามารถเข้าถึงข้อมูลในวงที่แคบลงในกรณีที่เราค้นหาข้อมูลหรือจัดการข้อมูลโดยการค้นหาโดยใช้วันที่ แต่เนื่องจากว่าถ้าหากเราต้องการนำข้อมูลใน table Order นี้ไปสรุปรายเดือนซึ่งอาจจะต้องแยกกันไปตามทวีปที่มีการสั่งซื้อดังนั้นเราอาจจะแบ่งย่อยอีกได้ตามทวีปเพื่อเพิ่มประสิทธิภาพมากขึ้น

การแบ่ง partition table นั้นไม่ได้มีเพียงเท่านี้ใน database ของ oracle สามารถแบ่ง partition ไปยังในหน่วยความจำได้เช่น table space หรือแม้กระทั่ง datafile เพื่อช่วยเพิ่มประสิทธิภาพมากยิ่งขึ้น

และใน oracle 11g นั้นการ query จะทำได้เร็วยิ่งขึ้นเพราะว่าทุกครั้งที่มีการ query จะมีการเก็บผลลัพธ์ในการ query ในครั้งนั้นๆไว้ใน RAM ซึ่งถ้าหากมีการ query ข้อมูลเดิมอีกก็ไม่จำเป็นต้องดึงจาก harddisk แล้วดึงมาได้เลย แต่ว่า RAM ก็หดหายไปเรื่อยๆดังนั้นจึงต้องมีการ set ไว้ด้วยว่าให้ใช้ได้เท่าไร (ปกติก็กิน RAM อยู่แล้วแบบนี้ยิ่งแล้วใหญ่ดิ mad.gif )

แต่ถ้าถามว่าเพียงพอแล้วหรือยังคำตอบคือยังเพราะว่าถ้ามีข้อมูลมากกว่านี้หละก็ต่อให้ทำการแบ่งตารางแล้วอาจจะยังไม่พอทำ จึงต้องมีการนำข้อมูลที่ไม่ใช้นั้นเป็นเข้าไปอยู่ที่มีความสามารถในการจุมากกว่า database นั้นคือ data warehose ซึ่งการจะให้คำนิยามของ data warehouse นั้นสั้นๆง่ายๆ คือ เป็นที่รวมข้อมูลทุกๆอย่างไม่ว่าแหล่งข้อมูลนั้นจะมาจากแหล่งไหนๆ โดยคำว่า "ไม่ว่าแหล่งข้อมูลนั้นจะมาจากแหล่งไหนๆ" นั้นหมายถึงแหล่งข้อมูลที่มาจากที่ต่างๆไม่ว่าจะเป็น database (database ในที่นี้ไม่จำกัดทุกยี่ห้อสามารถนำลง data warehouse เดียวกันได้หมดโดยผ่านมาตรฐานกลางคือ SQL) หรือแม้กระทั่งมาจาก text, xml หรือ excel ดังนั้นเมื่อถึงระยะเวลาหนึ่ง database ก็จะถ่ายโอนข้อมูลเก่าๆนั้นเก็บลงใน Data warehouse เพื่อไม่ให้ database นั้นมีความเทอะทะเกินไปอาจส่งผลต่อความเร็วในการจัดการหรือค้นหาข้อมูลและถ้าถามว่า data warehouse มีประโยชน์แค่นี้หรอคำตอบคือไม่เพราะว่าข้อมูลเหล่านั้นที่ถูกเก็บไว้ไม่ได้ถูกเก็บไว้เฉยๆแต่จะถูกนำมาใช้ในการวางแผนธุรกิจซึ่งในการวางแผนนั้นจำเป็นที่ต้องใช้ข้อมูลเก่าๆที่เก็บไว้ย้อนหลังเป็น 4 หรือ 5 ปีเป็นอย่างน้อยในการวางแผนซึ่งเราเรียกระบบนี้ว่า BI (Business Inteligence)

IPB Image

และจะมีคำถามตามมาว่าข้อมูลที่เก็บไว้หลายๆปีนั้นมันต้องเยอะมาเวลาค้นหาหรือจัดการซักทีนั้นจะไม่ช้าหรอคำตอบคือไม่ช้าครับ เพราะว่า data warehouse นั้นมี algorithm ที่ไม่เหมือน database โดย database นั้นจะมีโครงสร้างข้อมูลที่เป็นแบบ relational ซึ่งเป็นการเก็บข้อมูล 2 มิติ dimension คือ

IPB Image

ถ้าจะเปรียบง่ายๆ relational นั้นเป็น สี่เหลี่ยมธรรมดา ที่มีมุมมองอยู่ที่ 2 มิติ กว้างกับยาว
แต่ data warehouse นั้นจะมีลักษณะโครงสร้างที่เรียกว่า multi-dimensional คือจะมีมิติเพิ่มขึ้นมาอีกหนึ่งมิติซึ่งเปรียบเหมือน สี่เหลี่ยมลูกบาศก์ (cubic) ที่เราชอบบิดไปบิดมานั้นแหละ
http://www.maa.org/editorial/mathgames/MetaCubicSudoku.gif
โดยจะเห็นว่ามิติที่เพิ่มขึ้นมานั้นก็คือความลึกนั้นเองซึ่งเวลาค้นหาข้อมูลที่มีอยู่เยอะๆนั้น เพื่อเพิ่มความเร็วข้อมูลนั้น โครงสร้างข้อมูลที่เรามองเสมือนเป็น cubic ก็จะถูกบิดไปบิดมาเพื่อที่จะทำให้ข้อมูลที่ต้องการค้นหาหรือจัดการนั้นค้นหาได้เร็วขึ้น และนี่คือความลับว่าทำไมข้อมูลที่กองอยู่ใน data warehouse จนฝุ่นจับนั้นสามารถ จัดการหรือค้นหาได้รวดเร็วทันใจ
ซึ่งลักษณะโครงสร้างที่เรียกว่า multi-dimensional ใน oracle เค้าจะเรียกว่า OLAP
ซึ่ง data warehouse ของ oracle ที่ใหญ่ที่สุดในโลกนี้เก็บข้อมูลที่ใหญ่ถึง 300 TB โดย vendor ที่เก็บข้อมูลได้เยอะขนาดนี้คือ amazon นั้นเอง
และนอกจากตารางจะสามารถทำการแบ่งตารางได้แล้ว data warehouse ยังสามารถทำ partition OLAP ได้ด้วยเพื่อเพิ่มความเร็วในการค้นหา

นอกจากการเพิ่มประสิทธิภาพ database โดยใช้วิธี partition แล้วยังมีอีกวิธีคือ RAC (Real Application Cluster) เนื่องจากว่า oracle นั้นเป็นตัวที่กินทรัพยากรมากดังนั้นจึงมีข้อเสนอว่าจะจะเอาหลายๆเครื่องมารวมกันเพื่อเพิ่มประสิทธิให้กับ ระบบ เพื่อรองรับ กับการกินทรัพยากรของ oracle หรือว่าต้องการให้ระบบเราเร็วขึ้นแต่บังเอิญว่าเครื่อง server นั้นเก่าไปเพิ่ม RAM ก็ไม่ได้ harddisk ไม่ได้ดังนั้นแทนที่จะซื้อเครื่องใหม่แล้วโยก DB ตัวดิมไปเครื่งใหม่ซึ่งถือว่ายุ่งยากมากก็ให้นำเครื่องใหม่มาเพิ่มแล้วทำ cluster ทำให้มองเห็นว่าเครื่อง database มีเครื่องเดียวและ share ทรัพยากรกันทำให้ได้ประสิทธิภาพมาขึ้น

สรุป database นั้นเป็นแหล่งเก็บข้อมูลสำหรับการทำ transaction ส่วน data warehouse เป็นที่เก็บข้อมูลที่ไม่มการเรียกใช้บ่อยแต่จะเรียกใช้ในกรณีที่มีความต้องการนำข้อมูลย้อนหลังมาวางแผนหรือทำราบงานสรุป

ข้อคิดจากหัวข้อจะเห็นได้ว่าส่วนที่เกี่ยวข้องกับหัวข้ออยู่ในบรรทัดสุดท้ายนี่เอง 5555 rolleyes.gif rolleyes.gif

ข้อมูลทั้งหมดได้มาจากการ train oracle data warehouse ครับซึ่งเป็นส่วนเล็กๆน้อยๆเองครับถ้าสนใจเข้าไปหาได้ใน เวบ oracle เลยครับ

ไม่ทราบว่าไม่ hide ได้หรือเปล่าครับ admin เพราะว่าเป็นข้อมูลงั้นๆแหละไม่มีไรน่าสนใจ