تا %60 تخفیف خرید برای 3 نفر با صدور مدرک فقط تا
00 00 00
در توسینسو تدریس کنید

مقدمه ای بر پایگاه داده های مبتنی بر گراف به زبان خیلی ساده

گراف دیتابیس ها(graph database) این امکان را برای ما فراهم می کنند که ما داده ها و رابطه ها رو در قالب ساختار گراف ذخیره کنیم .

 

حالا این ساختار گراف به چه کار ما می آید ؟ !!!

 

مقدمه ای بر پایگاه داده های مبتنی بر گراف به زبان خیلی ساده

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

 

مقدمه ای بر پایگاه داده های مبتنی بر گراف به زبان خیلی ساده

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

مقدمه ای بر پایگاه داده های مبتنی بر گراف به زبان خیلی سادهمقدمه ای بر پایگاه داده های مبتنی بر گراف به زبان خیلی ساده

مقدمه ای بر پایگاه داده های مبتنی بر گراف به زبان خیلی ساده

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

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

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

مقدمه ای بر پایگاه داده های مبتنی بر گراف به زبان خیلی ساده

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

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

مقدمه ای بر پایگاه داده های مبتنی بر گراف به زبان خیلی ساده

مقدمه ای بر پایگاه داده های مبتنی بر گراف به زبان خیلی ساده

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

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

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

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

مقدمه ای بر پایگاه داده های مبتنی بر گراف به زبان خیلی ساده

ساخت پایگاه داده تستی به اسم 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

 

مقدمه ای بر پایگاه داده های مبتنی بر گراف به زبان خیلی سادهمقدمه ای بر پایگاه داده های مبتنی بر گراف به زبان خیلی ساده

 

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);

نویسنده: حامد فروردین

منبع: جزیره پایگاه داده وب سایت توسینسو

هرگونه نشر و کپی برداری با ذکر نام نویسنده بلامانع است

نظر شما
برای ارسال نظر باید وارد شوید.
0 نظر

هیچ نظری ارسال نشده است! اولین نظر برای این مطلب را شما ارسال کنید...

افرادی که این مطلب را خواندند مطالب زیر را هم خوانده اند