Microsoft SQL Server 2017 Datasheet ( 3 )

Microsoft SQL Server 2017 Datasheet ตอนที่ 3
เหลืออีกไม่กี่ตอนก็ใกล้จะจบการเล่าถึง 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 ดังรูป โดยมีความหมายดังนี้คือ
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> เพิ่มเข้ามา
- คนบางคนเป็นเพื่อนกับคนบางคน
- คนกับคู่เป็นคู่รักกัน
- คนเป็นเจ้าของรถยนต์
- คนขับรถ
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 ดังสคลิปต์
USE TestGraph; GO CREATE SCHEMA edges; GO CREATE TABLE edges.friend AS EDGE; CREATE TABLE edges.love AS EDGE; CREATE TABLE edges.own AS EDGE; CREATE TABLE edges.drive AS EDGE; GO |

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

ผู้เขียนจะสร้างความสัมพันธ์ตามรูปดังสคลิปต์ต่อไปนี้
หากสืบค้น ตาราง edges.friend และตาราง edges.love จะปรากฏเซตผลลัพธ์ดังแสดง
USE TestGraph; GO INSERT INTO edges.friend VALUES ( (SELECT $node_id FROM nodes.Person WHERE id = 2) , (SELECT $node_id FROM nodes.Person WHERE id = 1) ) INSERT INTO edges.friend VALUES ( (SELECT $node_id FROM nodes.Person WHERE id = 1) , (SELECT $node_id FROM nodes.Person WHERE id = 3) ) INSERT INTO edges.friend VALUES ( (SELECT $node_id FROM nodes.Person WHERE id = 3) , (SELECT $node_id FROM nodes.Person WHERE id = 4) ) INSERT INTO edges.friend VALUES ( (SELECT $node_id FROM nodes.Person WHERE id = 4) , (SELECT $node_id FROM nodes.Person WHERE id = 5) ) INSERT INTO edges.love VALUES ( (SELECT $node_id FROM nodes.Person WHERE id = 2) , (SELECT $node_id FROM nodes.Person WHERE id = 5) ) INSERT INTO edges.love VALUES ( (SELECT $node_id FROM nodes.Person WHERE id = 5) , (SELECT $node_id FROM nodes.Person WHERE id = 2) ) GO |
หากสืบค้น ตาราง edges.friend และตาราง edges.love จะปรากฏเซตผลลัพธ์ดังแสดง
ผลลัพธ์จากการสืบค้นตาราง edges.friend

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

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

จากนั้นผู้เขียนสร้างความสัมพันธ์ระหว่าง Person กับ Car ด้วย edges ชื่อ own และ drive ตามรูป ดังสคลิปต์ต่อไปนี้
หากสืบค้น ตาราง edges.own และตาราง edges.drive จะปรากฏเซตผลลัพธ์ดังแสดง
USE TestGraph; GO INSERT INTO edges.own VALUES ( (SELECT $node_id FROM nodes.Person WHERE id = 5) , (SELECT $node_id FROM nodes.Car WHERE id = 1) ) INSERT INTO edges.own VALUES ( (SELECT $node_id FROM nodes.Person WHERE id = 2) , (SELECT $node_id FROM nodes.Car WHERE id = 4) ) INSERT INTO edges.drive VALUES ( (SELECT $node_id FROM nodes.Person WHERE id = 2) , (SELECT $node_id FROM nodes.Car WHERE id = 1) ) INSERT INTO edges.drive VALUES ( (SELECT $node_id FROM nodes.Person WHERE id = 3) , (SELECT $node_id FROM nodes.Car WHERE id = 4) ) GO |
หากสืบค้น ตาราง edges.own และตาราง edges.drive จะปรากฏเซตผลลัพธ์ดังแสดง
ผลลัพธ์จากการสืบค้นตาราง edges.own

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

จะเห็นว่า edge เป็นการเชื่อมต่อจาก node_id หนึ่งไปหาอีก node_id หนึ่งตาม JSON string ที่แสดง
เมื่อมีข้อมูลพร้อมแล้ว ผู้เขียนจะทดลอง Query โดยให้ค้นหาว่าเพื่อนของเพื่อนคนใดเป็นเจ้าของรถยนต์ดังสคลิปต์ต่อไปนี้
ผลลัพธ์ที่ได้คือ
จะเห็นว่าฐานข้อมูล Graph จะมุ่งเน้นและทำงานเกี่ยวกับความสัมพันธ์ระหว่าง Entities ได้ดีมาก ซึ่งมีข้อมูลในชีวิตประจำวันทั่วไป และตาม Social Network เป็นข้อมูลลักษณะนี้ เชื่อม และลิ้งก์กันไปมา การที่ Microsoft SQL Server 2017 หันมาสนใจเก็บข้อมูลแบบนี้ ก็เป็นทางเลือกที่ดีไม่น้อยเลย
เมื่อมีข้อมูลพร้อมแล้ว ผู้เขียนจะทดลอง Query โดยให้ค้นหาว่าเพื่อนของเพื่อนคนใดเป็นเจ้าของรถยนต์ดังสคลิปต์ต่อไปนี้
USE TestGraph; GO SELECT Person1.name , Person2.name , Person3.name , Car.Brand , Car.Model FROM nodes.Person as Person1 , nodes.Person as Person2 , nodes.Person as Person3 , edges.own , edges.friend as Friend1 , edges.friend as Friend2 , nodes.car as Car WHERE MATCH(Person1-(friend1)->Person2-(friend2)->Person3 AND Person3-(own)->car); |
ผลลัพธ์ที่ได้คือ
name | name | name | Brand | Model |
Somsak | Somsorn | Phatheep | Volvo | V70 |
จะเห็นว่าฐานข้อมูล Graph จะมุ่งเน้นและทำงานเกี่ยวกับความสัมพันธ์ระหว่าง Entities ได้ดีมาก ซึ่งมีข้อมูลในชีวิตประจำวันทั่วไป และตาม Social Network เป็นข้อมูลลักษณะนี้ เชื่อม และลิ้งก์กันไปมา การที่ Microsoft SQL Server 2017 หันมาสนใจเก็บข้อมูลแบบนี้ ก็เป็นทางเลือกที่ดีไม่น้อยเลย