การออกแบบ MSSQL database ด้วย Geography Datatype

Posted by on March 18, 2015

สวัสดีทุกท่านครับ,

นี้เป็นบทความแรกของผมกับบ้านหลังนี้น่ะครับ ผมอยากจะขอเริ่มจากการ ออกแบบฐานข้อมูลที่สามารถรองรับพิกัด Latitude, Longitude  เพื่อช่วยในการคำนวนหาระยะทางระหว่างพื้นที่ต่างๆได้น่ะครับ

โดยในบทความนี้ ผมจะแบ่งวิธีการออกแบบเป็น 3 ส่วนน่ะครับ

* ผมใช้ MSSQL Server 2008 R2 น่ะคร้าบ

1.1 วิธีแรกคือการ เก็บค่า พิกัด Latitude , Longitude ด้วย Demincal Datatype น่ะครับ

Capture

 

จากรูปบนจะเห็นว่าเราได้ทำการสร้าง columns ขึ้นมาสองอันเพื่อรองรับ Latitude และ Longitude ด้วย Decimal DataType น่ะครับ

 

1.2. ทีนี้เรามาทดลองกรอกข้อมูลเข้าตารางนี้กัน

Capture

1.3. หลังจากนั้นทำการคำนวนหาระยะทาง โดยตัวอย่างที่ผมสร้างไว้ข้างล่างนี้ผมทดลองเขียน CLR function จาก C# เพื่อคำนวนหาระยะทางจากจุดสองจุดน่ะครับ

Capture

จากตัวอย่างที่ทดลองให้ดู เปรียบเทียบกับจำนวนข้อมูลประมาณ สองแสน แถว ก็พบว่าใช้เวลาคำนวนไม่นานน่ะครับ, แต่วิธีนี้มีข้อเสียที่เราต้องเขียน code เพื่อคำนวนหาระยะทางขึ้นมาเองซึ่งจำเป็นต้องมีการ Test & Verify ว่าการคำนวนที่เขียนขึ้นมานั้นมีความคลาดเคลื่อนขนาดไหนน่ะครับ

Capture

ตัวอย่าง CLR Function ที่เขียนด้วย C# ครับผม
2.1 วิธีที่สองนี้ ผมจะใช้ Geography Datatype ซึ่งเป็น Datatype แบบใหม่สำหรับการจัดเก็บข้อมูลภูมิศาสตร์น่ะครับ เรามาลองดูตัวอย่างข้างล่างกันครับ

Capture

เราจะสังเกตุเห็นว่าการเก็บด้วย Geography Datatype จะได้ข้อมูลแบบ Binary น่ะครับ เพราะฉะนั้นจำเป้นต้องใช้ Function เฉพาะของ Geography Datatype เพื่อทำการคำนวนหาข้อมูลอื่นๆต่อไป (เช่น Latitude , Longitude)

 

1.2. ทีนี้เรามาทดลองกรอกข้อมูลเข้าตารางนี้กัน

Capture

 

มีวิธีการกรอก Geography ได้หลายแบบน่ะครับ แบบที่ผมยกมาคือ สร้าง Geography ผ่าน Point function (ค่า 4326 คือ ค่าคงที่น่ะครับ เป็น Spatial Reference Identifiers (SRIDs))

 

2.3. หลังจากนั้นทำการคำนวนหาระยะทางด้วย built-in function กันครับ

Capture

จากตัวอย่างนี้ ผมได้ทำการใช้ built-in function ชื่อ STDistance ในการคำนวนหาระยะทางเลยน่ะครับ จะสังเกตุเห็นว่าทำได้ง่ายและใช้เวลาไม่นานในการเขียน code ครับ…
เพียงแต่ จะสังเกตุเห็นว่าระยะเวลาที่ใช้ ค้นหา นานกว่าวิธีแรกมากๆ (วิธีแรกแค่ สามร้อยกว่า ms)

เราเลยจำเป็นที่จะต้องสร้าง Index แบบ พิเศษสำหรับ Geography Datatype ขึ้นมาครับ เราเรียก index ประเภทนี้ว่า Spatial  Index

 

2.4 ทดลองสร้าง Spatial Index

Capture

 

 

2.5 ทำการคำนวนหาระยะทางอีกครั้ง…

Capture

 

จะสังเกตุเห็นว่า วิธีนี้จะเร็วที่สุดเลยน่ะครับ เร็วกว่าวิธีแรกด้วย

 

บทสรุป

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

 

Capture

Posted in: MSSQL, MSSQL2008R2