ฐานข้อมูลเชิงเวลา (Temporal Database)
โดยคุณ Fanig Ni

ฐานข้อมูลเชิงเวลาคือฐานข้อมูลที่มีความสามารถในการจัดเก็บข้อมูลท่ีเปลี่ยนแปลงไปตามเวลา เช่นชื่อ ที่อยู่ สถานที่ทำงานเป็นต้น ซึ่งในเวลาต่อมาได้มีการถกเถียงกันว่า ข้อมูลบางอย่างไม่ได้เป็นข้อมูลที่ เปลี่ยนแปลงไปตามเวลาแต่เปลี่ยนแปลงไปตามความสามารถหรือเทคโนโลยีในการประเมินค่าของมนุษย์ เช่นความสูงของยอดเขา ความสว่างของดวงดาวเป็นต้นก็สมควรที่จะจัดเก็บด้วยฐานข้อมูลเชิงเวลาได้ ดังนั้นความหมายที่อธิบายคำว่าระบบฐานข้อมูลเชิงเวลาได้ดีที่สุดคือ ฐานข้อมูลนำเสนอแง่มุมทางเวลา โดยไม่ถือรวมเวลาที่ประกอบเป็นความจริงส่วนหนึ่งของข้อมูล

ในยุคเริ่มแรกได้มีการถกเถียงกันเก่ียวกับ timing attribute ว่าสมควรจะมองเสมือน attribute ธรรมดา หรือควรมองแยกออกมาเป็นอีกมิติและให้ภาระการจัดการข้อมูลเชิงเวลาตกเป็นของ DBMS ท้ังหมด ซึ่งแนวคิดหลังน้ีค่อนข้างจะเป็นท่ีนิยมกว่าเนื่องจาก การบริหารจัดการข้อมูลเกี่ยวกับช่วงเวลานั้นมี ความยุ่งยากเป็นอย่างมาก ซึ่งจะนำเสนอให้เห็นในบทความนี้ต่อไป

ในประวัติศาสตร์ประมาณปี 1996 ประเทศอเมริกาได้พบว่าเน้ือวัวที่ส่งขายจำนวนหน่ึงได้ติดเชื้อโรคระบาดในเน้ือวัวเหล่านั้น และผู้จำหน่ายเนื้อวัวเหล่านั้นไม่สามารถทราบได้เลยว่าเนื้อจำนวนนั้น มาจากโรงฆ่าสัตว์ไหน และมีวัวตัวไหนท่ีอยู่คอกเดียวกันบ้างในเวลาเดียวกันบ้าง โดยต้ังสมมติฐานที่ว่า วัวท่ี อยู่คอกเดียวกัน น่าจะเป็นวัวที่ติดเชื้อชนิดเดียวกัน ซึ่งผู้จำหน่ายเนื้อวัวเหล่านี้ไม่สามารถตอบคำถาม เหล่านี้ได้เลย เป็นผลให้ต้องเรียกคืนเน้ือวัวท้ังหมดท่ีจาหน่ายโดยบริษัทนี้ในประเทศอเมริกาทาให้บริษัทน้ี สูญเสียรายได้เป็นอย่างมาก จึงเกิดแนวคิดข้ึนว่าหากเราสามารถสอบถามข้อมูลย้อนกลับไปได้ว่าเน้ือแต่ละชิ้นมาจากวัวตัวไหน คอกไหน หรือแม้แต่กระทั้งวัวตัวใดเคยอยู่คอกเดียวกันกับวัวตัวท่ีติดเชื้อเหล่าน้ีบ้าง จะทำให้ลดการสูญเสียรายได้มหาศาลของบริษัทนี้ลงได้

จากเหตุการณ์ดังกล่าวเราสามารถนาฐานข้อมูลเชิงเวลาเข้ามาแก้ได้ปัญหาที่เกิดจากเหตุการณ์น้ีได้ ดังจะกล่าวถึงดังต่อไปน้ี

Valid Time state table

Valid time state table คือตารางท่ีเพ่ิม valid time เข้ามาเพ่ือบอกว่าข้อมูลใดที่ยังเป็นจริงอยู่ ในฐานข้อมูลเชิงเวลาบ้าง ดังตัวอย่างต่อไปน้ี (ตัวอย่างจาเป็นต้องเพิ่ม column เวลามาเพ่ือช่วยในการ อธิบาย แต่พึงระลึกไว้เสมอว่าสิ่งผู้เขียนพยายามจะนาเสนอคือ เวลาจะถูกซ่อนเป็นอีกมิติให้ DBMS เป็น ผู้จัดการ)



ตารางน้ีนำเสนอรายละเอียดของวัวแต่ละฝูงว่าเคยอยู่คอกใดในช่วงเวลาใดบ้างโดยท่ี FDYD_ID แทนลานให้อาหารของวัว LOT_ID_NUM แทนหมายเลขฝูงของวัว PEN_ID แทนคอกย่อยของวัว HD_CNT แทนจำนวนวัวในฝูงนั้น และ FROM_DATE, TO_DATE แทนวันเวลาท่ีข้อมูลนั้นยังเป็นจริง หาก TO_DATE = 9999-12-31 ให้หมายความ ข้อมูลน้ันยังเป็นจริงมาจนถึงปัจจุบัน

จากตางรางข้างต้นแสดงตัวอย่างให้เห็นว่าวัวฝูง 219 น้ันเคยอยู่คอกที่ 1 เมื่อวันที่ 1998-02-25 จนถึงวันท่ี 1998-02-28 จำนวนท้ังสิ้น 43 ตัว จากน้ันวันท่ี 1998-03-01 ได้แยกวัวฝูงน้ีกระจายไปเป็น 2 คอก คือคอกที่ 1 จำนวน 20 ตัวและคอกที่ 2 จำนวน 23 ตัวจนถึงวันท่ี 1998-03-13 จากนั้นได้จับวัวฝูงนี้ มาอยู่รวมที่ 2 ด้วยกันอีกครั้งจนถึงปัจจุบัน จะเห็นว่ารายละเอียดการย้ายคอกของวัวฝูงนี้จะไม่สามารถ แสดงได้เลยหากเราใช้ฐานข้อมูลแบบปกติ

ตัวอย่างคาถามเชิงเวลาสาหรับข้อมูลเชิงเวลา

Temporal Selection เป็นการสอบถามข้อมูลเชิงเวลาโดยไม่มีการ join ระหว่าง 2 ตาราง (ข้อมูลทุกอย่างปรากฎครบถ้วนในตารางเดียว)

Current Query (สอบถามคำถามที่อยู่ยังเป็นจริงอยู่ในปัจจุบัน) ตัวอย่างคำถามประเภทน้ีเช่น “ในแต่ละคอกย่อยของลานให้อาหารท่ี 1 มีวัวฝูง 219 อยู่คอกใดและมีจำนวนก่ีตัวบ้าง"
จะเห็นได้ว่าจากคำถามดังกล่าวหากเป็นระบบฐานข้อมูลปกติสามารถใช้ SQL Query ธรรมดาได้ ง่ายดายดังน้ี

SELECT PEN ID, HD CNT FROM LOT LOC WHERE FDYD ID = 1 AND LOT ID NUM = 219

แต่หากเป็นฐานข้อมูลเชิงเวลาจะต้องระบุช่วงเวลาที่เป็นปัจจุบันไปด้วยดังนี้

SELECT PEN ID, HD CNT FROM LOT LOC
WHERE FDYD ID = 1 AND LOT ID NUM = 219 AND TO DATE = DATE ’9999-12-31’

ซึ่งผลลัพธ์จะได้ดังนี้ของการ select ทั้งสองแบบจะได้ดังนี้



Sequence Query (การสอบถามถึงข้อมูลต่างๆ ที่เปลี่ยนแปลงไปในอดีต) คำถามประเภทนี้จะเป็นการถาม โดยการระบุช่วงเวลาในอดีตจนถึงปัจจุบันเพื่อต้องการทราบประวัติการเปลี่ยนแปลงของข้อมูลเช่น “ในเวลาท่ีผ่านมา วัวฝูง 219 เคยอยู่ในคอกย่อยใดบ้างและคอกล่ะก่ีตัว" สามารถเขียน SQL เพื่อตอบคาถาม ดังกล่าวได้ดังนี้

SELECT PEN ID, HD CNT, FROM DATE, TO DATE FROM LOT LOC WHERE FDYD ID = 1 AND LOT ID NUM = 219

จะเห็นว่าหากเราไม่ระบุเวลาในฐานข้อมูลเชิงเวลา จะมีความหมายเทียบเท่า ช่วงเวลาทั้งหมดจากอดีต จนถึงปัจจุบัน ซึ่งจะให้ผลลัพธ์ดังนี้



ซึ่งคำถามลักษณะนี้ หากเป็นการเก็บลงฐานข้อมูลปกติ จะไม่มีทางตอบคำถามได้อย่างแน่นอน

Temporal Joins ในบางครั้งตารางเพียง 1 ตารางไม่เพียงพอจะให้ข้อมูลในการตอบคำถามทั้งหมด จึงจำเป็นต้องมีการ join เกิดขึ้นซึ่งจะแสดงให้เห็นดังตัวอย่างคำถามต่อไปนี้ “มีวัวฝูงใดบ้างที่อยู่คอกเดียวกัน" พิจารณาจากคำถามนี้ หากใช้ฐานข้อมูลทั่วไป ไม่มีทางเลยที่จะตอบได้แต่หากเป็นฐานข้อมูลเชิงเวลา จะตอบคำถามดังกล่าวได้ จะต้องคิดพิจารณาถึงเหตุการณ์การอยู่ร่วมกันของวัว 2 ฝูงดังน้ี
  1. วัว 2 ฝูงเคยอยู่ร่วมกันจริงในอดีต (sequence query)
  2. วัว 2 ฝูงอยู่ร่วมกันจริงในปัจจุบัน (current query)
  3. วัว 2 ฝูงเคยอยู่คอกเดียวกัน แต่คนละเวลา (non-sequence query)

คำตอบท่ี 1 ฝูงเคยอยู่ร่วมกันจริงในอดีต หากพิจราณาเป็นเส้นเวลาจะสามารถเขียนได้ดังน้ี
กรณีวัวฝูงท่ี1 มาอยู่คอกเดียวกันในช่วงเวลาท่ีฝูงที่ 2 ยังคงอยู่คอกเดิมและออกจากคอกนี้ไปก่อนฝูง 2 จะออกดังน้ี
page4image31488

กรณีวัวฝูงที่ 1 มาอยู่ร่วมคอกเดียวกับ วัวฝูงที่ 2 โดยท่ีวัวฝูงที่ 2 นั้นมาอยู่ก่อน วัวฝูงที่ 1 มาอยู่ตามหลัง และวัวฝูงที่ 2 ได้ออกไปจากคอกก่อนท่ีวัวฝูงที่ 1 จะออกตามไปดังแสดงให้เห็นในแผนภาพดังนี้

page5image13752

ซึ่งพิจารณากรณีท่ีเป็นไปได้ทั้งหมดแล้วต้องเขียนคำตอบสำหรับคำตอบน้ีคำตอบเดียวถึง 4 กรณี ดังแสดง ให้เห็นด้วยภาษา SQL-92 ดังนี้

SELECT L1.LOT ID NUM, L2.LOT ID NUM, L1.PEN ID, L1.FROM DATE, L1.TO DATE FROM LOT LOC AS L1, LOT LOC AS L2 WHERE L1.LOT ID NUM < L2.LOT ID NUM AND L1.FDYD ID = L2.FDYD ID AND L1.PEN ID = L2.PEN ID AND L2.FROM DATE <= L1.FROM DATE AND L1.TO DATE <= L2.TO DATE
UNION SELECT L1.LOT ID NUM, L2.LOT ID NUM, L1.PEN ID, L1.FROM DATE, L2.TO DATE FROM LOT LOC AS L1, LOT LOC AS L2 WHERE L1.LOT ID NUM < L2.LOT ID NUM AND L1.FDYD ID = L2.FDYD ID AND L1.PEN ID = L2.PEN ID AND L1.FROM DATE > L2.FROM DATE AND L2.TO DATE < L1.TO DATE AND L1.FROM DATE < L2.TO DATE
UNION SELECT L1.LOT ID NUM, L2.LOT ID NUM, L1.PEN ID, L2.FROM DATE, L1.TO DATE FROM LOT LOC AS L1, LOT LOC AS L2 WHERE L1.LOT ID NUM < L2.LOT ID NUM AND L1.FDYD ID = L2.FDYD ID AND L1.PEN ID = L2.PEN ID AND L2.FROM DATE > L1.FROM DATE AND L1.TO DATE < L2.TO DATE AND L2.FROM DATE < L1.TO DATE
UNION SELECT L1.LOT ID NUM, L2.LOT ID NUM, L1.PEN ID, L2.FROM DATE, L2.TO DATE FROM LOT LOC AS L1, LOT LOC AS L2 WHERE L1.LOT ID NUM < L2.LOT ID NUM AND L1.FDYD ID = L2.FDYD ID AND L1.PEN ID = L2.PEN ID AND L2.FROM DATE >= L1.FROM DATE AND L2.TO DATE <= L1.TO DAT

จะเห็นได้ว่าแค่คำตอบเดียว จำเป็นต้องเขียนภาษา SQL มากมายเพื่อหาคำตอบให้ครอบคลุมถึง 4 กรณี ด้วยกัน ซึ่งมันอาจจะไม่ใช่เรื่องยาก แต่มันเป็นเรื่องยุ่งที่จะเขียนโดยไม่มีข้อผิดพลาด

คำตอบท่ี 2 วัว 2 ฝูงอยู่ร่วมกันจริงในปัจจุบัน

SELECT L1.LOT ID NUM, L2.LOT ID NUM, L1.PEN ID FROM LOT LOC AS L1, LOT LOC AS L2 WHERE L1.LOT ID NUM < L2.LOT ID NUM AND L1.FDYD ID = L2.FDYD ID AND L1.PEN ID = L2.PEN ID AND L1.TO DATE = DATE ‘9999-12-31’ AND L2.TO DATE = DATE ‘9999-12-31’

คำตอบท่ี 3 วัว 2 ฝูงเคยอยู่คอกเดียวกันแต่คนละเวลา

SELECT L1.LOT ID NUM, L2.LOT ID NUM, L1.PEN ID FROM LOT LOC AS L1, LOT LOC AS L2 WHERE L1.LOT ID NUM <
L2.LOT ID NUM AND L1.FDYD ID = L2.FDYD ID AND L1.PEN ID = L2.PEN ID

และสุดท้ายจะต้องนำคำตอบท้ังหมดของแต่ละคำถามมา union กันเพื่อตอบคำถามที่ว่า “วัวตัวใดเคยอยู่ คอกเดียวกัน ?" จากความยุ่งยากดังกล่าวอาจารย์ Richard Snodgrass ผู้เขียนบทความได้พยายามจะผลักดันให้เกิดเป็น feature ใหม่ในภาษา SQL เพื่อลดความยุ่งยากในการพัฒนาโปรแกรมประยุกติ์เชิง เวลาลงดังนี้

คำถามเดิม “วัวคอกไหนเคยอยู่คอกเดียวกันบ้าง" สำหรับคำตอบท่ีว่า วัวต้องเคยอยู่คอกเดียวกันจริงไม่ว่า จะช่วงเวลาใดในอดีตสามารถเขียนได้โดยเพิ่ม keyword “VALIDTIME" ดังน้ี

VALIDTIME SELECT L1.LOT ID NUM, L2.LOT ID NUM, L1.PEN ID FROM LOT LOC AS L1, LOT LOC AS L2 WHERE L1.LOT ID NUM < L2.LOT ID NUM AND L1.FDYD ID = L2.FDYD ID AND L1.PEN ID = L2.PEN ID

ซึ่ง DBMS จะจัดการให้ครอบคลุมทั้ง 4 กรณีที่เกิดข้ึนให้เองโดยท่ีผู้พัฒนาโปรไม่จำเป็นต้องรู้ว่าระบบ ฐานข้อมูล มี column เวลาอยู่ด้วยซ้ำ และหากต้องการคำตอบท่ีว่า วัวเคยอยู่คอกเดียวกันแต่คนละ ช่วงเวลา ก็ทำได้เพียงแค่ระบุ keyword “NONSEQUENCED" ก่อนหน้า “VALIDTIME" เท่าน้ัน

ความสามารถดังกล่าวนี้ได้ถูกเพิ่มเติมเป็นมาตรฐานภาษา SQL ปี 2011 เป็นที่เรียบร้อย แต่ด้วยความที่ Oracle เล็งเห็นว่าความสามารถด้านเวลาของระบบฐานข้อมูลนั้น มีความสำคัญเป็นอย่างมากต่อภาครัฐ และภาคเอกชน Oracle จงึ ได้เพิ่มเติมความสามารถในการบริหารจัดการและตอบคำถามเกี่ยวกับข้อมูลเชิงเวลาขึ้นมาให้ผลิตภัณฑ์ของตัวเองภายใต้ feature ที่มีช่ือว่า Workspace Manage ซึ่งได้พัฒนาจนแล้ว เสร็จก่อนท่ีจะมีมาตรฐานภาษา SQL 2011 ภาษา SQL 2011 นั้นได้ถูกนำเสนอโดย Krishna Kulkarni, Jan-Eike Michels จากบริษัท IBM Corporation ทำให้ DBMS ของ IBM ซึ่งคือ DB2 Version 10 ที่คาดว่าได้ออกตามหลังมาตรฐานภาษา SQL 2011 จึงเป็น DBMS ท่ีสามารถ support ความสามารถด้านเวลา ได้อย่างครบถ้วนและตรงตามมาตรฐานภาษา SQL ซึ่งแน่นอนทาง Oracle ผู้ซึ่งพัฒนาความสามารถด้าน เวลาน้ีเสร็จสิ้นก่อนจะมีมาตรฐานภาษาย่อมไม่ใช่สิ่งท่ีเป็นไปตามมาตรฐาน Oracle จึงจำเป็นที่จะต้อง ปรับปรุงสิ่งตนมีอยู่ให้เป็นไปตามมาตฐานภาษา SQL ดังนั้น Oracle จึงได้เพิ่มเติมความสามารถนี้ไปยัง Oracle รุ่นล่าสุดคือรุ่น 12c และรับประกันว่าความสามารถในการบริหารจัดการข้อมูลด้านเวลาของ ตนเองน้ันเป็นไปตามมาตรฐานภาษา SQL 2011 เป็นที่เรียบร้อย แต่ก็ได้มีผู้นำความสามารถเหล่านี้ไป ทดลองตามเอกสารอ้างอิงมาตรฐานภาษา SQL 2011 กลับพบว่า Oracle 12c ยังไม่สามารถใช้ keyword สำคัญๆในการตอบคำถาม/บริหารจัดการข้อมูลเชิงเวลาตามมาตรฐานได้ ทำได้เพียงแค่ create และ insert ข้อมูลเชิงเวลาเท่านั้น

เอกสารอ้างอิง

หมายเหตุ รายละเอียดเก่ียวกับฐานข้อมูลเชิงเวลาที่จะกล่าวถึงต่อไปน้ีได้ศึกษาและแปลมาจากบทความ Managing Temporal Data A Five-Part Series ของ ผู้เขียนท่ีช่ือ Richard T. Snodgrass ซึ่งเป็นข้อมูลเกี่ยวกับการใช้ประโยชน์เกี่ยวกับการตอบคำถามของฐานข้อมูลเชิงเวลา ยังไม่พูดถึงเรื่องการบริหารจัดการ ข้อมูลเชิงเวลา ซึ่งหากผู้อ่านสนใจสามารถศึกษาได้ด้วยตนเองตามเอกสารอ้างอิงที่ได้แนบมา และหากมีโอกาสผู้เขียนบทความจะมาเขียนถึงการบริหารจัดการ ข้อมูลเชิงเวลาในบทความครั้งหน้า


141211.14:52:48
• แปลงเป็น web page.

141212.9:14:05
• Published.