حامد  فروردین
مدیر تیم توسعه | Development شرکت Tecnotree

Graph Database چیست؟ مقدمه ای بر پایگاه داده های مبتنی بر گراف

گراف دیتابیس ها(graph database) این امکان را برای ما فراهم می کنند که ما داده ها و رابطه ها رو در قالب ساختار گراف ذخیره کنیم .حالا این ساختار گراف به چه کار ما می آید ؟ !!! در پایگاه داده های رابطه ای بستگی به نوع سناریو که داریم بعضی اوقات نیاز هست که برای پیاده سازی روابط خیلی پیچیده ، داده ها را در قالب جداول متعدد ذخیره کنیم .. این جا ما مجبور به نوشتن Query ها و Join های زیادی بودیم که بتوانیم خروجی و گزارش دلخواه مان را بسازیم . همینطور که در جریان هستید هرچقدر کوئری های ما بزرگ و پیچیده بشود و روابط بین جداول زیاد (Join) ، هزینه اجرای دستور ما (Cost of Query) بالا میرود و سرعت اجرای دستورات پایین و پایین تر ...

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران

Graph Database چیست؟ مقدمه ای بر پایگاه داده های مبتنی بر گراف

 

Graph Database چیست؟ مقدمه ای بر پایگاه داده های مبتنی بر گراف

 دوستی ها در شبکه های اجتماعی، like ها ، مدیریت follower ها و پیشنهاد دوستی های چند گانه مثالی از این روابط پیچیده برای ذخیره سازی و بازیابی در پایگاه داده های رابطه ای است .

Graph Database چیست؟ مقدمه ای بر پایگاه داده های مبتنی بر گرافGraph Database چیست؟ مقدمه ای بر پایگاه داده های مبتنی بر گراف

Graph Database چیست؟ مقدمه ای بر پایگاه داده های مبتنی بر گراف

با استفاده از امکانات گراف دیتابیس می توانیم این پیچیدگی ها را ساده کنیم .

Neo4j, OrientDB , Amazon Neptune از معروف ترین پایگاه داده های مبتنی بر گراف هستند و جالبه که بدانید که ماکروسافت از سال 2017 این امکان را بر روی پایگاه داده معروف خودش یعنی SQL Server قرار داده است .

مزیت این امکان در نسخه SQL Server 2017 به بالا این هست که ما دیگر نیازی به یادگیری زبان جدید در پایگاه داده نداریم و با همین زبان T-SQL می توانیم یک Graph Database بسازیم و مفاهیم مربوط به آنها را پیاده سازی کنیم .

Graph Database چیست؟ مقدمه ای بر پایگاه داده های مبتنی بر گراف

مفاهیم اصلی Graph Database ها : 

  • گره‌ها یا node ← نشان دهنده موجودیت یا entitiy های ما هستند .. مثل مردم، کسب و کار ، حساب‌های کاربری  ...
  • یال‌ها یا edge ← و به‌طور کلی یال‌ها وظیفه نمایش روابط را در دیتابیس بر عهده دارند. همچنین بسیاری از اطلاعات مهم در یال‌ها ذخیره می‌شوند.

Graph Database چیست؟ مقدمه ای بر پایگاه داده های مبتنی بر گراف

Graph Database چیست؟ مقدمه ای بر پایگاه داده های مبتنی بر گراف

چه موقع از ساختار گراف بهتره استفاده کرد ؟

  1. مواقعی که برنامه شما دارای داده ها با ساختار سلسله مراتبی است (hierarchy) .. مثل  چارت سازمانی
  2. موجودیت های شما دارای روابط پیچیده چند به چند باشد

مثال عملی و پیاده سازی یه Graph Database بر روی SQL Server 2017

می خواهیم روابط و موجودیت های این گراف را در پایگاه داده پیاده سازی کنیم :

Graph Database چیست؟ مقدمه ای بر پایگاه داده های مبتنی بر گراف

ساخت پایگاه داده تستی به اسم GraphDemo

-- Create a graph demo database
CREATE DATABASE GraphDemo

USE graphdemo;
GO

ساخت جداول node ها یا entitiy ها 

-- Create NODE tables
CREATE TABLE Person (
	ID INTEGER PRIMARY KEY
	,name VARCHAR(100)
	) AS NODE;

CREATE TABLE Restaurant (
	ID INTEGER NOT NULL
	,name VARCHAR(100)
	,city VARCHAR(100)
	) AS NODE;

CREATE TABLE City (
	ID INTEGER PRIMARY KEY
	,name VARCHAR(100)
	,stateName VARCHAR(100)
	) AS NODE;

ساخت جداول یال ها یا edge 

-- Create EDGE tables. 
CREATE TABLE likes (rating INTEGER) AS EDGE;

CREATE TABLE friendOf AS EDGE;

CREATE TABLE livesIn AS EDGE;

CREATE TABLE locatedIn AS EDGE;

اضافه کردن داده ها در جداول node ها

-- Insert data into node tables. Inserting into a node table is same as inserting into a regular table
INSERT INTO Person
VALUES (
	1
	,'John'
	);

INSERT INTO Person
VALUES (
	2
	,'Mary'
	);

INSERT INTO Person
VALUES (
	3
	,'Alice'
	);

INSERT INTO Person
VALUES (
	4
	,'Jacob'
	);

INSERT INTO Person
VALUES (
	5
	,'Julie'
	);

INSERT INTO Restaurant
VALUES (
	1
	,'Taco Dell'
	,'Bellevue'
	);

INSERT INTO Restaurant
VALUES (
	2
	,'Ginger and Spice'
	,'Seattle'
	);

INSERT INTO Restaurant
VALUES (
	3
	,'Noodle Land'
	,'Redmond'
	);

INSERT INTO City
VALUES (
	1
	,'Bellevue'
	,'wa'
	);

INSERT INTO City
VALUES (
	2
	,'Seattle'
	,'wa'
	);

INSERT INTO City
VALUES (
	3
	,'Redmond'
	,'wa'
	);

اضافه کردن داده ها در جداول edge ها و شروع ایجاد روابط با استفاده از node_id$ .. مدیریت لایک ها و ...

-- Insert into edge table. While inserting into an edge table, 
-- you need to provide the $node_id from $from_id and $to_id columns.
INSERT INTO likes
VALUES (
	(
		SELECT $NODE_ID
		FROM Person
		WHERE id = 1
		)
	,(
		SELECT $NODE_ID
		FROM Restaurant
		WHERE id = 1
		)
	,9
	);

INSERT INTO likes
VALUES (
	(
		SELECT $NODE_ID
		FROM Person
		WHERE id = 2
		)
	,(
		SELECT $NODE_ID
		FROM Restaurant
		WHERE id = 2
		)
	,9
	);

INSERT INTO likes
VALUES (
	(
		SELECT $NODE_ID
		FROM Person
		WHERE id = 3
		)
	,(
		SELECT $NODE_ID
		FROM Restaurant
		WHERE id = 3
		)
	,9
	);

INSERT INTO likes
VALUES (
	(
		SELECT $NODE_ID
		FROM Person
		WHERE id = 4
		)
	,(
		SELECT $NODE_ID
		FROM Restaurant
		WHERE id = 3
		)
	,9
	);

INSERT INTO likes
VALUES (
	(
		SELECT $NODE_ID
		FROM Person
		WHERE id = 5
		)
	,(
		SELECT $NODE_ID
		FROM Restaurant
		WHERE id = 3
		)
	,9
	);

INSERT INTO livesIn
VALUES (
	(
		SELECT $NODE_ID
		FROM Person
		WHERE id = 1
		)
	,(
		SELECT $NODE_ID
		FROM City
		WHERE id = 1
		)
	);

INSERT INTO livesIn
VALUES (
	(
		SELECT $NODE_ID
		FROM Person
		WHERE id = 2
		)
	,(
		SELECT $NODE_ID
		FROM City
		WHERE id = 2
		)
	);

INSERT INTO livesIn
VALUES (
	(
		SELECT $NODE_ID
		FROM Person
		WHERE id = 3
		)
	,(
		SELECT $NODE_ID
		FROM City
		WHERE id = 3
		)
	);

INSERT INTO livesIn
VALUES (
	(
		SELECT $NODE_ID
		FROM Person
		WHERE id = 4
		)
	,(
		SELECT $NODE_ID
		FROM City
		WHERE id = 3
		)
	);

INSERT INTO livesIn
VALUES (
	(
		SELECT $NODE_ID
		FROM Person
		WHERE id = 5
		)
	,(
		SELECT $NODE_ID
		FROM City
		WHERE id = 1
		)
	);

INSERT INTO locatedIn
VALUES (
	(
		SELECT $NODE_ID
		FROM Restaurant
		WHERE id = 1
		)
	,(
		SELECT $NODE_ID
		FROM City
		WHERE id = 1
		)
	);

INSERT INTO locatedIn
VALUES (
	(
		SELECT $NODE_ID
		FROM Restaurant
		WHERE id = 2
		)
	,(
		SELECT $NODE_ID
		FROM City
		WHERE id = 2
		)
	);

INSERT INTO locatedIn
VALUES (
	(
		SELECT $NODE_ID
		FROM Restaurant
		WHERE id = 3
		)
	,(
		SELECT $NODE_ID
		FROM City
		WHERE id = 3
		)
	);

-- Insert data into the friendof edge.
INSERT INTO friendof
VALUES (
	(
		SELECT $NODE_ID
		FROM person
		WHERE ID = 1
		)
	,(
		SELECT $NODE_ID
		FROM person
		WHERE ID = 2
		)
	);

INSERT INTO friendof
VALUES (
	(
		SELECT $NODE_ID
		FROM person
		WHERE ID = 2
		)
	,(
		SELECT $NODE_ID
		FROM person
		WHERE ID = 3
		)
	);

INSERT INTO friendof
VALUES (
	(
		SELECT $NODE_ID
		FROM person
		WHERE ID = 3
		)
	,(
		SELECT $NODE_ID
		FROM person
		WHERE ID = 1
		)
	);

INSERT INTO friendof
VALUES (
	(
		SELECT $NODE_ID
		FROM person
		WHERE ID = 4
		)
	,(
		SELECT $NODE_ID
		FROM person
		WHERE ID = 2
		)
	);

INSERT INTO friendof
VALUES (
	(
		SELECT $NODE_ID
		FROM person
		WHERE ID = 5
		)
	,(
		SELECT $NODE_ID
		FROM person
		WHERE ID = 4
		)
	);

نمایش داده ها و بازیابی رکوردها .. همینطور که میبینید خروجی کوئری ها بصورت فرمت json هست :

SELECT *
FROM dbo.friendOf

 

Graph Database چیست؟ مقدمه ای بر پایگاه داده های مبتنی بر گرافGraph Database چیست؟ مقدمه ای بر پایگاه داده های مبتنی بر گراف

 

USE GraphDemo
GO

SELECT *
FROM Person

SELECT *
FROM Likes

SELECT *
FROM LivesIn

-- Find Restaurants that John likes
SELECT Restaurant.name
FROM Person
	,likes
	,Restaurant
WHERE MATCH(Person - (likes) - > Restaurant)
	AND Person.name = 'John';

-- Find Restaurants that John's friends like
SELECT Restaurant.name
FROM Person person1
	,Person person2
	,likes
	,friendOf
	,Restaurant
WHERE MATCH(person1 - (friendOf) - > person2 - (likes) - > Restaurant)
	AND person1.name = 'John';

-- Find people who like a restaurant in the same city they live in
SELECT Person.name
FROM Person
	,likes
	,Restaurant
	,livesIn
	,City
	,locatedIn
WHERE MATCH(Person - (likes) - > Restaurant - (locatedIn) - > City
		AND Person - (livesIn) - > City);

 


حامد  فروردین
حامد فروردین

مدیر تیم توسعه | Development شرکت Tecnotree

دارای مدرک کارشناسی مهندسی نرم افزار با بیش از 14 سال سابقه کار حرفه ای در حوزه IT به عنوان توسعه دهنده ، طراح پایگاه داده ، مدیر دوآپس ، مشاور و مدیر سیستم های نرم افزاری در شرکت های داخلی و بین المللی .. هم اکنون به عنوان مدیر تیم توسعه محصولات دیجیتال و دوآپس در شرکت tecnotree و پروژه ایرانسل مشغول به کار هستم .

نظرات