گراف دیتابیس

گراف دیتابیس

در ساده ترین تعریف، گراف در sql server 2017  مجموعه ای از جداول Node  و  جداول Edge می باشد.یک جدول Node اشاره به یک موجودیت دارد که به عنوان مثال می تواند یک شخص یک سازمان و... باشد و جدول Edge  اشاره به ارتباط بین دو Node  دارد.

جداول Node  و Edge  میوانند تحت هر Schema یی در پایگاه داده ایجاد شوند اما همهکی آنها متعلق به یک گراف منطقی می باشند.

Graph database ها زمانی که برنامه هایی با ارتباطات پیچیده چند به چند داریم بسیار مفید هستند.

برخی از مهم ترین ویژگی های Gragh Database ها میتواند موارد زیر را نام برد:

  • Edgeها یا رابطه ها اولین کلاس موجودیت ها در گراف دیتابی هستند و میتواند ویژگی ها [Attribute]  خاصیت هایی [Property] را به آنها نسبت داد
  • یک Edge  به تنهایی میتواند با انعطاف پذیری چندین ارتباط را بین نودها ایجاد کند
  • با استفاده از گراف ها ما میتوانیم به آسانی به تشریح کوئری هایی با الکوهای انطباق و راهبری بپردازیم
  • با استفاده از گراف ها ما میتوانیم به آسانی به تشریح کوئری هایی با الکوهای چندریختی بپردازیم

ساختار Graph Database در  SqlServer 2017  به شکل زیر است:

 

Architecture of SQL Server 2017 Graph Database

 

 

 

اجازه بدین با یک مثال ساده ویژگی های گراف دیتابیس را تشریح کنیم

 

یک شبکه اجتماعی را در نطر بگیرید. هر یک از افراد عضو این شبکه اجتماعی حکم Node را دارند و ارتباطات بین آنها در واقع همان Edge ها هستند

 

 

 

 

 
 

 

SQL Server 2017 Graph database properties example

 

 

 

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

Node Table

جدول Node  موجودیت های گراف را در خود نگه میدارد. هر بار که ما یک جدول Node  ایجاد می کنیم، یک ستون مجازی به نام  $ node_id ایجاد می شود که یک شماره شناسایی منحصر به فرد در  جدول Node را در خود نگه میدارد. مقادیر موجود در ستون $ node_id به طور خودکار تولید می شوند و ترکیبی از object_id از جدول Node  و یک مقدار از نوع  bigint است. هربار ، هنگامی که ستون $ node_id را Select میکنیم ، یک مقدار محاسبه شده در شکل یک رشته JSON نمایش داده می شود. همچنین باید بدانیم که، $ node_id  یک ستون مجازی  است، که به یک نام داخلی با رشته هگزا در آن Map  میشود. وقتی ما   $node_id  را از جدول Select می کنیم، نام ستون به بصورت  $ node_id_ \ hex_string ظاهر می شود.

پیشنهاد میشه زمانی که جدول Node را ایجاد میکنید روی ستون $node_id ایندکدس گزاری کنید اما اگر اینکار را انجام ندهید بطور پیشقرض ایندکسی از نوع Non-Clustered برای ان ایجاد خواهد شد

ساختار دستور ایجاد جدول Node به شرح زیر است

CREATE TABLE  

    [ database_name . [ schema_name ] . | schema_name . ] table_name  

    ( {  } [ ,...n ] )  

    AS [NODE]

[ ; ]

 

 

 

برای مثال اگز بخواهیم جدولی به نام Person با فیلدهای ID,Name,City  بسیازیم. کد به این صورت خواهد بود

Create database GraphDB

Go

Use GraphDB

go

CREATE TABLE Person (

        ID INTEGER PRIMARY KEY, 

        name VARCHAR(100), 

        City VARCHAR(100)

 ) AS NODE;

 

 

 

درج اطلاعات در این جدول مشابه سایر جداول است

Insert into Person values (1,'Raj','Guragon')

Insert into Person values (2,'Kashish','Jaipur')

 

حالا زمانی که از این جدول Select بگیریم

 

 

$node_id column is added into the node table for SQL Server 2017 Graph Databases

 

همونطور که قبلا هم گقته شد اگر ما ایندکسی را تعیین نکنیم Sql اینکارو انجام خواهد شد

 

SQL Server 2017 Graph Database index on the node table

 

 

 

Edge Table

Edge table ها اشاره به روابط بین موجودیت ها و به به عبارت دیگه ر.ابط بین Node ها دارند

ساختار ایجاد این جداول بصورت زیر است

CREATE TABLE   

    [ database_name . [ schema_name ] . | schema_name . ] table_name   

    ( {  } [ ,...n ] )   

    AS [Edge]

[ ; ]

 

Edge Table ها را میتوان بدون تعریف ستون و یا با تعریف ستونهای دلخواه خودمون ایجاد کنیم.

 

CREATE TABLE friendOf AS EDGE;

یا

 

CREATE TABLE likes (rating INTEGER) AS EDGE;

 

 

زمانی که میخواهیم اطلاعاتی را در جداول Edge درج کنیم مجبور هستیم این اطلاعات را از جدول  Node دریافت کنیم

قرض کنیم به جدول friendOf  که پیش تر ایجاد کردیم میخواهیم اطلاعاتی درج کنیم این مقادیر قاعدتا باید اطلاعات نودهای ابتدا و انتهای این Edge باشد

INSERT INTO friendof VALUES 

((SELECT $NODE_ID FROM person WHERE ID = 1), (SELECT $NODE_ID FROM person WHERE ID = 2))

 

 

select the content of friendof Edge table in a SQL Server 2017 Graph Database

 

 

$ edge_id   یک شماره شناسایی منحصر به فرد در  جدول Edge را در خود نگه میدارد. مقادیر موجود در ستون $ edge_id به طور خودکار تولید می شوند و ترکیبی از object_id از جدول edge  و یک مقدار از نوع  bigint است. هربار ، هنگامی که ستون $ edge_id را Select میکنیم ، یک مقدار محاسبه شده در شکل یک رشته JSON نمایش داده می شود. همچنین باید بدانیم که، $ edge_id  یک ستون مجازی  است، که به یک نام داخلی با رشته هگزا در آن Map  میشود. وقتی ما   $edge_id  را از جدول Select می کنیم، نام ستون به بصورت  $ edge_id_ \ hex_string ظاهر می شود.

use the pseudo-column name in the query instead of using the name with hex strings in a SQL Server 2017 Graph Database

 

$from_id : این ستون مشخص کننده این است که نود ابتدایی این Edge کدام است

$to_id : این ستون مشخص کننده این است که نود پایانی این Edge کدام است

 در تصویر زیر ساختار ارتباطی جداول Node  و Edge را میتوانید بررسی . مشاهده کنید

 

architecture of how the nodes and edge table stores data as well as how the data links to each other in a SQL Server 2017 Graph Database

مرتضی جنگجو

برنامه نویس fullstack با بیش از 14 سال سابقه کار و همکاری در توسعه و پیاده سازی نرم افزارهای تحت وب با تکنولوژی Net. در شرکتهای بزرگ ایرانی، هلندی، فنلاندی و ترکیه

شبکه های اجتماعی نویسنده

دیدگاه کاربران

مطالب مرتبط