قبل از شروع دوره
پایگاه داده های گراف یک فناوری مهم برای متخصصان پایگاه داده است. من سعی میکنم با نوآوریها و فناوریهای جدید در این زمینه همگام باشم و پس از کار با پایگاههای داده رابطهای و NoSQL، نقش پایگاههای اطلاعاتی گراف را به طور فزایندهای مهم میبینم. هنگام کار با داده های سلسله مراتبی پیچیده، نه تنها پایگاه های داده سنتی، بلکه NoSQL نیز بی اثر هستند. اغلب، با افزایش تعداد سطوح اتصال و اندازه پایگاه داده، عملکرد کاهش می یابد. و با پیچیده تر شدن روابط، تعداد JOIN ها نیز افزایش می یابد.
البته، مدل رابطه ای راه حل هایی برای کار با سلسله مراتب دارد (به عنوان مثال، استفاده از CTE های بازگشتی)، اما اینها هنوز راه حل هستند. در عین حال، عملکرد پایگاه های داده گراف SQL Server به شما این امکان را می دهد که به راحتی چندین سطح سلسله مراتب را مدیریت کنید. هم مدل داده و هم پرس و جوها ساده شده اند و بنابراین کارایی آنها افزایش می یابد. مقدار کد به میزان قابل توجهی کاهش می یابد.
پایگاه داده های گراف یک زبان رسا برای نمایش سیستم های پیچیده هستند. این فناوری در حال حاضر به طور گسترده در صنعت فناوری اطلاعات در زمینه هایی مانند شبکه های اجتماعی، سیستم های ضد تقلب، تجزیه و تحلیل شبکه فناوری اطلاعات، توصیه های اجتماعی، توصیه های محصول و محتوا استفاده می شود.
عملکرد پایگاه داده گراف در SQL Server برای سناریوهایی که داده ها به شدت به هم متصل هستند و روابط کاملاً مشخصی دارند مناسب است.
مدل داده های نموداری
گراف مجموعه ای از رئوس (گره ها) و یال ها (روابط، یال) است. راس ها نشان دهنده موجودیت ها و یال ها نشان دهنده روابطی هستند که ویژگی های آنها ممکن است حاوی اطلاعات باشد.
یک پایگاه داده گراف، موجودیت ها را به عنوان یک گراف که در تئوری گراف تعریف شده است، مدل می کند. ساختار داده ها رئوس و یال هستند. ویژگی ها ویژگی های رئوس و یال ها هستند. اتصال، اتصال رئوس است.
برخلاف سایر مدلهای داده، پایگاههای داده گراف، روابط بین موجودیتها را در اولویت قرار میدهند. بنابراین، نیازی به محاسبه روابط با استفاده از کلیدهای خارجی یا هر وسیله دیگری نیست. ایجاد مدل های داده پیچیده تنها با استفاده از انتزاعات راس و لبه امکان پذیر است.
در دنیای مدرن، مدلسازی روابط نیازمند تکنیکهای پیچیدهتر است. برای مدل سازی روابط، SQL Server 2017 قابلیت های پایگاه داده گراف را ارائه می دهد. رئوس و یال های نمودار به صورت انواع جدیدی از جداول نشان داده می شوند: NODE و EDGE. پرس و جوهای گراف از یک تابع T-SQL جدید به نام MATCH() استفاده می کنند. از آنجایی که این قابلیت در SQL Server 2017 تعبیه شده است، می توان از آن در پایگاه داده های موجود بدون نیاز به هیچ گونه تبدیلی استفاده کرد.
مزایای مدل نمودار
امروزه، کسبوکارها و کاربران برنامههایی را درخواست میکنند که دادههای بیشتری را مدیریت کنند، در حالی که انتظار عملکرد و قابلیت اطمینان بالایی دارند. نمایش دادهها بهعنوان یک نمودار، وسیلهای مناسب برای مدیریت روابط پیچیده است. این رویکرد بسیاری از مشکلات را حل می کند و به دستیابی به نتایج در یک زمینه خاص کمک می کند.
به نظر می رسد بسیاری از برنامه ها در آینده از استفاده از پایگاه های داده گراف بهره مند شوند.
مدل سازی داده ها: از مدل رابطه ای تا نموداری
مثال
بیایید به نمونه ای از ساختار سازمانی با سلسله مراتبی از کارکنان نگاه کنیم: یک کارمند به یک مدیر گزارش می دهد، یک مدیر به یک مدیر ارشد و غیره. بسته به شرکت خاص، ممکن است تعدادی سطح در این سلسله مراتب وجود داشته باشد. اما با افزایش تعداد سطوح، محاسبه روابط در یک پایگاه داده رابطه ای دشوارتر و دشوارتر می شود. تصور سلسله مراتب کارکنان، سلسله مراتب در بازاریابی یا ارتباطات در شبکه های اجتماعی بسیار دشوار است. بیایید ببینیم چگونه SQL Graph می تواند مشکل مدیریت سطوح مختلف سلسله مراتب را حل کند.
برای این مثال ما یک مدل داده ساده خواهیم ساخت. بیایید جدولی از کارمندان ایجاد کنیم EMP با شناسه EMPNO و ستون M.G.R.، با نشان دادن شناسه سرپرست کارمند (مدیر). تمام اطلاعات مربوط به سلسله مراتب در این جدول ذخیره می شود و می توان با استفاده از ستون ها پرس و جو کرد EMPNO и M.G.R..
نمودار زیر همان مدل ساختار سازمانی را با چهار سطح تودرتو به شکلی آشناتر نشان می دهد. کارکنان رئوس یک نمودار از یک جدول هستند EMP. نهاد "کارمند" با اتصال "ارسال" (ReportsTo) به خود متصل می شود. از نظر نمودار، پیوند یک یال (EDGE) است که گرهها (NODE) کارمندان را به هم متصل میکند.
بیایید یک جدول منظم ایجاد کنیم EMP و مقادیر را مطابق نمودار بالا در آنجا اضافه کنید.
CREATE TABLE EMP
(EMPNO INT NOT NULL,
ENAME VARCHAR(20),
JOB VARCHAR(10),
MGR INT,
JOINDATE DATETIME,
SALARY DECIMAL(7, 2),
COMMISIION DECIMAL(7, 2),
DNO INT)
INSERT INTO EMP VALUES
(7369, 'SMITH', 'CLERK', 7902, '02-MAR-1970', 8000, NULL, 2),
(7499, 'ALLEN', 'SALESMAN', 7698, '20-MAR-1971', 1600, 3000, 3),
(7521, 'WARD', 'SALESMAN', 7698, '07-FEB-1983', 1250, 5000, 3),
(7566, 'JONES', 'MANAGER', 7839, '02-JUN-1961', 2975, 50000, 2),
(7654, 'MARTIN', 'SALESMAN', 7698, '28-FEB-1971', 1250, 14000, 3),
(7698, 'BLAKE', 'MANAGER', 7839, '01-JAN-1988', 2850, 12000, 3),
(7782, 'CLARK', 'MANAGER', 7839, '09-APR-1971', 2450, 13000, 1),
(7788, 'SCOTT', 'ANALYST', 7566, '09-DEC-1982', 3000, 1200, 2),
(7839, 'KING', 'PRESIDENT', NULL, '17-JUL-1971', 5000, 1456, 1),
(7844, 'TURNER', 'SALESMAN', 7698, '08-AUG-1971', 1500, 0, 3),
(7876, 'ADAMS', 'CLERK', 7788, '12-MAR-1973', 1100, 0, 2),
(7900, 'JAMES', 'CLERK', 7698, '03-NOV-1971', 950, 0, 3),
(7902, 'FORD', 'ANALYST', 7566, '04-MAR-1961', 3000, 0, 2),
(7934, 'MILLER', 'CLERK', 7782, '21-JAN-1972', 1300, 0, 1)
تصویر زیر کارمندان را نشان می دهد:
- کارمند با EMPNO 7369 اطاعت 7902;
- کارمند با EMPNO 7902 از 7566 تبعیت می کند
- کارمند با EMPNO 7566 از 7839 تبعیت می کند
حالا بیایید به نمایش نموداری از همان داده ها نگاه کنیم. راس EMPLOYEE دارای چندین صفت است و با رابطه زیردستان (EmplReportsTo) به خود متصل می شود. EmplReportsTo نام رابطه است.
جدول لبه (EDGE) همچنین ممکن است دارای ویژگی هایی باشد.
بیایید یک جدول گره EmpNode ایجاد کنیم
نحو برای ایجاد یک گره بسیار ساده است: به عبارت ایجاد جدول به انتها اضافه می شود "AS NODE".
CREATE TABLE dbo.EmpNode(
ID Int Identity(1,1),
EMPNO NUMERIC(4) NOT NULL,
ENAME VARCHAR(10),
MGR NUMERIC(4),
DNO INT
) AS NODE;
حالا بیایید داده ها را از یک جدول معمولی به یک نمودار تبدیل کنیم. بعد INSERT داده ها را از یک جدول رابطه ای درج می کند EMP.
INSERT INTO EmpNode(EMPNO,ENAME,MGR,DNO) select empno,ename,MGR,dno from emp
در جدول گره ها در یک ستون خاص $node_id_*
شناسه گره به صورت JSON ذخیره می شود. ستون های باقی مانده از این جدول حاوی ویژگی های گره هستند.
ایجاد لبه ها (EDGE)
ایجاد جدول لبه بسیار شبیه به ایجاد جدول گره است، با این تفاوت که از کلمه کلیدی استفاده می شود "AS EDGE".
CREATE TABLE empReportsTo(Deptno int) AS EDGE
حالا بیایید با استفاده از ستون ها ارتباط بین کارمندان را تعریف کنیم EMPNO и M.G.R.. نمودار ساختار سازمانی به وضوح نحوه نوشتن را نشان می دهد INSERT.
INSERT INTO empReportsTo VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 1),
(SELECT $node_id FROM EmpNode WHERE id = 13),20);
INSERT INTO empReportsTo VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 2),
(SELECT $node_id FROM EmpNode WHERE id = 6),10);
INSERT INTO empReportsTo VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 3),
(SELECT $node_id FROM EmpNode WHERE id = 6),10)
INSERT INTO empReportsTo VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 4),
(SELECT $node_id FROM EmpNode WHERE id = 9),30);
INSERT INTO empReportsTo VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 5),
(SELECT $node_id FROM EmpNode WHERE id = 6),30);
INSERT INTO empReportsTo VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 6),
(SELECT $node_id FROM EmpNode WHERE id = 9),30);
INSERT INTO empReportsTo VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 7),
(SELECT $node_id FROM EmpNode WHERE id = 9),30);
INSERT INTO empReportsTo VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 8),
(SELECT $node_id FROM EmpNode WHERE id = 4),30);
INSERT INTO empReportsTo VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 9),
(SELECT $node_id FROM EmpNode WHERE id = 9),30);
INSERT INTO empReportsTo VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 10),
(SELECT $node_id FROM EmpNode WHERE id = 6),30);
INSERT INTO empReportsTo VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 11),
(SELECT $node_id FROM EmpNode WHERE id = 8),30);
INSERT INTO empReportsTo VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 12),
(SELECT $node_id FROM EmpNode WHERE id = 6),30);
INSERT INTO empReportsTo VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 13),
(SELECT $node_id FROM EmpNode WHERE id = 4),30);
INSERT INTO empReportsTo VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 14),
(SELECT $node_id FROM EmpNode WHERE id = 7),30);
جدول لبه پیش فرض از سه ستون تشکیل شده است. اولین، $edge_id
- شناسه لبه در فرم JSON. دو تای دیگر ($from_id
и $to_id
) ارتباط بین گره ها را نشان می دهد. علاوه بر این، لبه ها می توانند خواص اضافی داشته باشند. در مورد ما اینطور است Deptno.
نماهای سیستم
در نمای سیستمی sys.tables
دو ستون جدید ظاهر شده است:
- is_edge
- is_node
SELECT t.is_edge,t.is_node,*
FROM sys.tables t
WHERE name like 'emp%'
ssms
اشیاء مربوط به نمودارها در پوشه Graph Tables قرار دارند. نماد جدول گره با یک نقطه و نماد جدول لبه با دو دایره متصل (کمی شبیه عینک) مشخص شده است.
عبارت MATCH
بیان MATCH برگرفته از CQL (Cypher Query Language). این یک روش کارآمد برای پرس و جو از خصوصیات یک گراف است. CQL با یک عبارت شروع می شود MATCH.
نحو
MATCH (<graph_search_pattern>)
<graph_search_pattern>::=
{<node_alias> {
{ <-( <edge_alias> )- }
| { -( <edge_alias> )-> }
<node_alias>
}
}
[ { AND } { ( <graph_search_pattern> ) } ]
[ ,...n ]
<node_alias> ::=
node_table_name | node_alias
<edge_alias> ::=
edge_table_name | edge_alias
نمونه
بیایید به چند نمونه نگاه کنیم.
پرسش زیر کارمندانی را که اسمیت و مدیرش به آنها گزارش می دهند نشان می دهد.
SELECT
E.EMPNO,E.ENAME,E.MGR,E1.EMPNO,E1.ENAME,E1.MGR
FROM
empnode e, empnode e1, empReportsTo m
WHERE
MATCH(e-(m)->e1)
and e.ENAME='SMITH'
پرس و جو زیر برای یافتن کارمندان و مدیران سطح دوم برای اسمیت است. اگر جمله را حذف کنید مکانی که در آن، سپس نتیجه همه کارمندان را نشان می دهد.
SELECT
E.EMPNO,E.ENAME,E.MGR,E1.EMPNO,E1.ENAME,E1.MGR,E2.EMPNO,e2.ENAME,E2.MGR
FROM
empnode e, empnode e1, empReportsTo m ,empReportsTo m1, empnode e2
WHERE
MATCH(e-(m)->e1-(m1)->e2)
and e.ENAME='SMITH'
و در نهایت یک درخواست از کارکنان و مدیران سطح سوم.
SELECT
E.EMPNO,E.ENAME,E.MGR,E1.EMPNO,E1.ENAME,E1.MGR,E2.EMPNO,e2.ENAME,E2.MGR,E3.EMPNO,e3.ENAME,E3.MGR
FROM
empnode e, empnode e1, empReportsTo m ,empReportsTo m1, empnode e2, empReportsTo M2, empnode e3
WHERE
MATCH(e-(m)->e1-(m1)->e2-(m2)->e3)
and e.ENAME='SMITH'
حالا بیایید مسیر را تغییر دهیم تا روسای اسمیت را بدست آوریم.
SELECT
E.EMPNO,E.ENAME,E.MGR,E1.EMPNO,E1.ENAME,E1.MGR,E2.EMPNO,e2.ENAME,E2.MGR,E3.EMPNO,e3.ENAME,E3.MGR
FROM
empnode e, empnode e1, empReportsTo m ,empReportsTo m1, empnode e2, empReportsTo M2, empnode e3
WHERE
MATCH(e<-(m)-e1<-(m1)-e2<-(m2)-e3)
نتیجه
SQL Server 2017 خود را به عنوان یک راه حل کامل سازمانی برای کارهای مختلف تجاری فناوری اطلاعات تثبیت کرده است. اولین نسخه SQL Graph بسیار امیدوارکننده است. حتی با وجود برخی محدودیتها، در حال حاضر عملکرد کافی برای کشف قابلیتهای نمودارها وجود دارد.
عملکرد SQL Graph به طور کامل در SQL Engine یکپارچه شده است. با این حال، همانطور که قبلاً گفته شد، SQL Server 2017 دارای محدودیت های زیر است:
بدون پشتیبانی از پلی مورفیسم
- فقط اتصالات یک طرفه پشتیبانی می شوند.
- Edge ها نمی توانند ستون های $from_id و $to_id را از طریق UPDATE به روز کنند.
- بسته های گذرا پشتیبانی نمی شوند، اما می توان آنها را با استفاده از CTE به دست آورد.
- پشتیبانی از اشیاء OLTP در حافظه محدود است.
- جداول موقت (جدول زمانی با نسخه سیستم)، جداول موقت محلی و سراسری پشتیبانی نمی شوند.
- انواع جدول و متغیرهای جدول را نمی توان به عنوان NODE یا EDGE اعلام کرد.
- پرس و جوهای بین پایگاه داده پشتیبانی نمی شوند.
- هیچ راه مستقیم یا جادوگری برای تبدیل جداول معمولی به جداول نموداری وجود ندارد.
- هیچ رابط کاربری گرافیکی برای نمایش نمودارها وجود ندارد، اما می توانید از Power BI استفاده کنید.
بیشتر بخوانید:
منبع: www.habr.com