علیرضا توکلی

دیتابیس گراف در SQL Server 2017 - بخش دوم

علیرضا توکلی senior web developer at tda.co

این محتوا بدون نظارت تیم سکان آکادمی تولید شده و صرفاً نظرات شخصی علیرضا توکلی می‌باشد.

توجه : مطلب زیر برداشتی از کتاب با عنوان Packt - SQLServer 2017 Developers Guide می باشد

در بخش اول ، درباره نظریه گراف صحبت شد و چند مثال بسیار خلاصه هم از گراف در ریاضیات گسسته مطرح شد. در این بخش می خواهیم درباره دیتابیس گراف در SQL Server 2017 و ویژگی های آن بدانیم.

پیش از این برای ایجاد ساختار گراف در SQL نیاز به قرار دادن جداول واسط بود. اکنون و در نسخه 2017 ، جداول گراف ، جزئی از موتور دیتابیس هستند و حتی نیاز به نصب برنامه های دیگر نیست. به محض نصب ، شما می توانید از تمام ویژگی های جداول گراف در تمام نسخه های SQL Server استفاده کنید.

برای ساخت دیتابیس های گراف در SQL 2017 ، دو نوع شئ در دسترس است :

1- جدول گره (Node)

2- جدول لبه (Edge)

به علاوه برای پیمایش گراف ها دستور جدید Match اضافه شده است.

جدول های گره و لبه ، در واقع جداولی معمولی هستند که ستون ها و attribute های مخصوصی دارند. اهمیت این مطلب این است که شاید فکر کنید جداول گراف کاملا از جداول دیگر جدا هستند ولی موضوع این است که شما میتوانید با همان شرایط قبل ، میان دیگر جداول و جداول گراف ایجاد رابطه کنید. بدیهی است که دستورات create و alter برای این جداول قابل دسترسی هستند.

جدول گره (Node Table):

جدول گره ، نمایانگر یک موجودیت (Entity) در سیستم گراف هستند. جدول های گره باید حداقل یک property داشته باشند. برای ساخت یک جدول گره ، کافی است به انتهای یک کوئری ساخت جدول ، عبارت AS NODE را اضافه کنید :

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

حال برای مثال یک رکورد وارد این جدول می کنیم :

INSERT INTO Person VALUES (1,'John');

همانطور که دیدید ، شما با یک عبارت (AS NODE) و یک Insert ساده ، یک جدول گره ایجاد و یک رکورد در آن وارد کردید. اما در قبل گفتیم که جدول های گراف attribute های اضافه ای نسبت به جداول دیگر دیتابیس دارند ولی شما هیچ چیز اضافه ای انجام ندادید. سوال این است که attribute های ذکر شده کجا هستند؟

اگر با کوئری ، داخل جدول ایجاد شده را نگاه کنیم ، چنین خواهیم دید :

 $node_id_8F0AB5A4AFA14696828F624B2E6C1FEF	         ID  name	  
----------------------------------------------------------------------------------
{"type":"node","schema":"dbo","table":"Person","id":0}	   1	John

اگر نگاه کنید ، یک ستون ناشناس را می بینید که شما آن را ایجاد نکرده اید. اینها همان attribute هایی هستند که درباره شان صحبت شد. بدین ترتیب که با ایجاد هر جدول از نوع گره ، یک ستون با عنوان $node_id به ابتدای آن اضافه می شود. اطلاعات داخل ، این ستون یک عبارت رشته ای Json که اطلاعات زیر را در خود ذخیره خواهد کرد را داراست :

- نوع جدول : گره / لبه

- شمای جدول

- نام جدول

- ستون های جدول و مقدار آنها برای هر رکورد

اما در نام این ستون علاوه بر عبارت $node_id ، یک شناسه unique نیز دیده می شود. این مورد برای آن است که در هنگام پیمایش گراف ها ، موتور دیتابیس بتواند این جدول را از دیگر جداول تشخیص دهد اما آیا باید در هر کوئری ، چنین نام طولانی را نوشت ؟ جواب خیر است. برای هر جدول با فراخوانی عبارت $node_id ، ستون مربوطه قابل دسترسی است. بنابر این میتوان گفت رکورد بالا ، نتیجه کوئری زیر است :

SELECT [$node_id]
      ,[ID]
      ,[name]
  FROM [Person]

اما این پایان کار نیست! اگر با استفاده از View سیستمی sys.Columns ستون های جدول گره مان را استخراج کنیم، به یک ستون دیگر بر خواهیم خورد. ستون دیگر ، $graph_id نام دارد. این ستون ، همانند ستون $node_id دارای یک شناسه unique در انتهای خود می باشد ، در واقع این ستون ، برای این جدول، مقدار $ graph_id_96C1FEFA4 B2E6FAA828F624146 را دارد.

نوع داده ستون $graph_id ، از جنس bigint است و برای شناسایی دیتابیسی که جدول گراف در آن ساخته شده است ، به کار می رود. این ستون و مقادیر ذخیره شده در آن قابل استخراج نیستند و صرفا موتور SQL به آنها دسترسی دارد.

حال شما یک جدول گره کامل دارید و به راحتی می توانید بر روی Index گذاری کرده و یا قید های مختلف قرار دهید.

- توجه داشته باشید که SSMS (SQL Server Management Studio) رابط گرافیکی برای ایجاد و تغییر جداول گراف ندارد و شما می بایست با کوئری چنین دسترسی هایی را ایجاد کنید

در مقاله ی بعدی این مبحث را ادامه خواهیم داد

ایدهٔ خود را در سکان‌پلاس بنویسید!

لیست نظرات
کاربر میهمان
دیدگاه شما چیست؟
کاربر میهمان
کاربر میهمان
کاربر میهمانمن یک کاربر مهمان هستم
۱۳۹۷/۱۲/۱۶
👍👍👍
کاربر میهمان
کاربر میهمانمن یک کاربر مهمان هستم
۱۳۹۷/۱۲/۱۱
سپاس از شما که Share میکنید