گراف دیتابیس ها(graph database) این امکان را برای ما فراهم می کنند که ما داده ها و رابطه ها رو در قالب ساختار گراف ذخیره کنیم .حالا این ساختار گراف به چه کار ما می آید ؟ !!! در پایگاه داده های رابطه ای بستگی به نوع سناریو که داریم بعضی اوقات نیاز هست که برای پیاده سازی روابط خیلی پیچیده ، داده ها را در قالب جداول متعدد ذخیره کنیم .. این جا ما مجبور به نوشتن Query ها و Join های زیادی بودیم که بتوانیم خروجی و گزارش دلخواه مان را بسازیم . همینطور که در جریان هستید هرچقدر کوئری های ما بزرگ و پیچیده بشود و روابط بین جداول زیاد (Join) ، هزینه اجرای دستور ما (Cost of Query) بالا میرود و سرعت اجرای دستورات پایین و پایین تر ...
دوستی ها در شبکه های اجتماعی، like ها ، مدیریت follower ها و پیشنهاد دوستی های چند گانه مثالی از این روابط پیچیده برای ذخیره سازی و بازیابی در پایگاه داده های رابطه ای است .
با استفاده از امکانات گراف دیتابیس می توانیم این پیچیدگی ها را ساده کنیم .
Neo4j, OrientDB , Amazon Neptune از معروف ترین پایگاه داده های مبتنی بر گراف هستند و جالبه که بدانید که ماکروسافت از سال 2017 این امکان را بر روی پایگاه داده معروف خودش یعنی SQL Server قرار داده است .
مزیت این امکان در نسخه SQL Server 2017 به بالا این هست که ما دیگر نیازی به یادگیری زبان جدید در پایگاه داده نداریم و با همین زبان T-SQL می توانیم یک 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
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 و پروژه ایرانسل مشغول به کار هستم .
زمان پاسخ گویی روز های شنبه الی چهارشنبه ساعت 9 الی 18
فقط به موضوعات مربوط به محصولات آموزشی و فروش پاسخ داده می شود