
گراف دیتابیس
در ساده ترین تعریف، گراف در sql server 2017 مجموعه ای از جداول Node و جداول Edge می باشد.یک جدول Node اشاره به یک موجودیت دارد که به عنوان مثال می تواند یک شخص یک سازمان و... باشد و جدول Edge اشاره به ارتباط بین دو Node دارد.
جداول Node و Edge میوانند تحت هر Schema یی در پایگاه داده ایجاد شوند اما همهکی آنها متعلق به یک گراف منطقی می باشند.
Graph database ها زمانی که برنامه هایی با ارتباطات پیچیده چند به چند داریم بسیار مفید هستند.
برخی از مهم ترین ویژگی های Gragh Database ها میتواند موارد زیر را نام برد:
- Edgeها یا رابطه ها اولین کلاس موجودیت ها در گراف دیتابی هستند و میتواند ویژگی ها [Attribute] خاصیت هایی [Property] را به آنها نسبت داد
- یک Edge به تنهایی میتواند با انعطاف پذیری چندین ارتباط را بین نودها ایجاد کند
- با استفاده از گراف ها ما میتوانیم به آسانی به تشریح کوئری هایی با الکوهای انطباق و راهبری بپردازیم
- با استفاده از گراف ها ما میتوانیم به آسانی به تشریح کوئری هایی با الکوهای چندریختی بپردازیم
ساختار Graph Database در SqlServer 2017 به شکل زیر است:

اجازه بدین با یک مثال ساده ویژگی های گراف دیتابیس را تشریح کنیم
یک شبکه اجتماعی را در نطر بگیرید. هر یک از افراد عضو این شبکه اجتماعی حکم Node را دارند و ارتباطات بین آنها در واقع همان Edge ها هستند
![]() |
پیاده سازی چنین شبکه هایی در پایگاه داده بدون گراف دیتابیس امکان پذیز است اما بسیار پیچیده و دشوار خواهد بود
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 بگیریم

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

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

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

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

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