เหลืออีกไม่กี่ตอนก็ใกล้จะจบการเล่าถึง Microsoft SQL Server 2017 Datasheet กันแล้วในครั้งนี้ผู้เขียนจะพูดถึง Graph Data Model ที่ Microsoft ใส่เข้ามาในผลิตภัณฑ์ Microsoft SQL Server 2017 ทั้งที่ Microsoft SQL Server ทำงานบน Relational Model เป็นหลัก ซึ่งทำให้ลูกค้าที่มีความจำเป็นต้องใช้ Graph Database แต่มีใช้ Microsoft SQL Server อยู่แล้วไม่นอกใจและหันไปหาผลิตภัณฑ์อื่น อาทิ Neo4j มาใช้งานเพิ่มเติม
Graph Database เหมาะสมกับข้อมูลที่ให้ความสำคัญกับความสัมพันธ์ระหว่าง Entities เป็นหลัก มากกว่า Attributes ภายใน Entity
Graph Database

Graph เป็นกลุ่มของ Node และ Relationship (หรือ edge) ที่เชื่อมเข้าด้วยกัน
Nodes เป็นตัวแทนของ Entities
Relationship (หรือ edge) ใช้อธิบายว่า Nodes เชื่อมต่อกันอย่างไร มีทั้งแบบมีทิศทาง และไม่มีทิศทาง
Graph ที่ง่ายที่สุดมีเพียง Node เดียว
ตัวอย่าง Graph Database

สำหรับตัวอย่างที่ผู้เขียนจะนำมาทดลองให้เห็นกันประกอบด้วย 2 Nodes คือ Person และ Car และ 4 Edges คือ friend, love, own และ drive ดังรูป โดยมีความหมายดังนี้คือ
คนบางคนเป็นเพื่อนกับคนบางคน
คนกับคู่เป็นคู่รักกัน
คนเป็นเจ้าของรถยนต์
คนขับรถ
โดยสร้าง 2 และใส่ข้อมูลลงไปดังสคริปต์ต่อไปนี้
CREATE DATABASE TestGraph;
GO
USE TestGraph;
GO
CREATE SCHEMA nodes;
GO
-- Create Person NODE table
CREATE TABLE nodes.Person
(
ID integer PRIMARY KEY
, name varchar(100)
, age integer
) AS NODE;
-- Insert data into Person node table
INSERT INTO nodes.Person VALUES (1,'Somchai',25);
INSERT INTO nodes.Person VALUES (2,'Somsri',21);
INSERT INTO nodes.Person VALUES (3,'Somsak',31);
INSERT INTO nodes.Person VALUES (4,'Somsorn',28);
INSERT INTO nodes.Person VALUES (5,'Phatheep',27);
GO
-- Create Car node table
CREATE TABLE nodes.Car
(
ID integer PRIMARY KEY
, Brand varchar(100)
, Model varchar(100)
) AS NODE;
-- Insert data into Car node table
INSERT INTO nodes.Car VALUES (1,'Volvo','V70');
INSERT INTO nodes.Car VALUES (2,'Chevrolet','Trailblazer');
INSERT INTO nodes.Car VALUES (3,'Honda','HRV');
INSERT INTO nodes.Car VALUES (4,'Masda','MX5');
INSERT INTO nodes.Car VALUES (5,'BMW','M4');
GO
เมื่อสร้าง Node Tables ตามสคริปต์ข้างต้นแล้วจะปรากฏ Node Tables อยู่ภายใต้โฟลเดอร์ Graph Tables และในแต่ละ Node Tables จะมีคอลัมน์ graph_id_<GUID> และ $node_id_<GUID> เพิ่มเข้ามา

และเมื่อสืบค้นตาราง nodes.Person และตาราง nodes.Car จะปรากฏคอลัมน์ $node_id_<GUID> ออกมา ซึ่งจะแสดงผลเป็น JSON string ดังเซตผลลัพธ์ด้านล่าง
ผลลัพธ์จากการสืบค้นตาราง nodes.Person

ผลลัพธ์จากการสืบค้นตาราง nodes.Car

จากนั้นผู้เขียนจะทำการเพิ่ม Edge Tables ลงไปเพื่อเชื่อมความสัมพันธ์ระหว่าง Node ดังสคลิปต์
|

สำหรับ Edge Tables เราไม่จำเป็นต้องสร้าง Attributes หรือคอลัมน์ลงไปก็ได้ เพราะจะมีการสร้างคอลมัน์พื้นฐานมาให้อยู่แล้ว เพราะใช้เชื่อม Nodes เข้าด้วยกัน ดังรูป

ผู้เขียนจะสร้างความสัมพันธ์ตามรูปดังสคลิปต์ต่อไปนี้
USE TestGraph; |
หากสืบค้น ตาราง edges.friend และตาราง edges.love จะปรากฏเซตผลลัพธ์ดังแสดง
ผลลัพธ์จากการสืบค้นตาราง edges.friend

ผลลัพธ์จากการสืบค้นตาราง edges.love

จะเห็นว่า edge เป็นการเชื่อมต่อจาก node_id หนึ่งไปหาอีก node_id หนึ่งตาม JSON string ที่แสดง

จากนั้นผู้เขียนสร้างความสัมพันธ์ระหว่าง Person กับ Car ด้วย edges ชื่อ own และ drive ตามรูป ดังสคลิปต์ต่อไปนี้
|
หากสืบค้น ตาราง edges.own และตาราง edges.drive จะปรากฏเซตผลลัพธ์ดังแสดง
ผลลัพธ์จากการสืบค้นตาราง edges.own

ผลลัพธ์จากการสืบค้นตาราง edges.drive

จะเห็นว่า edge เป็นการเชื่อมต่อจาก node_id หนึ่งไปหาอีก node_id หนึ่งตาม JSON string ที่แสดง
เมื่อมีข้อมูลพร้อมแล้ว ผู้เขียนจะทดลอง Query โดยให้ค้นหาว่าเพื่อนของเพื่อนคนใดเป็นเจ้าของรถยนต์ดังสคลิปต์ต่อไปนี้
USE TestGraph; |
ผลลัพธ์ที่ได้คือ
name | name | name | Brand | Model |
Somsak | Somsorn | Phatheep | Volvo | V70 |
จะเห็นว่าฐานข้อมูล Graph จะมุ่งเน้นและทำงานเกี่ยวกับความสัมพันธ์ระหว่าง Entities ได้ดีมาก ซึ่งมีข้อมูลในชีวิตประจำวันทั่วไป และตาม Social Network เป็นข้อมูลลักษณะนี้ เชื่อม และลิ้งก์กันไปมา การที่ Microsoft SQL Server 2017 หันมาสนใจเก็บข้อมูลแบบนี้ ก็เป็นทางเลือกที่ดีไม่น้อยเลย











