قواعد بيانات الرسم البياني هي تقنية مهمة لمحترفي قواعد البيانات. أحاول مواكبة الابتكارات والتقنيات الجديدة في هذا المجال ، وبعد العمل مع قواعد البيانات العلائقية و NoSQL ، أرى أن دور قواعد بيانات الرسم البياني أصبح أكثر أهمية. عند العمل باستخدام البيانات الهرمية المعقدة ، لا تكون قواعد البيانات التقليدية فحسب ، بل أيضًا NoSQL غير فعالة. في كثير من الأحيان ، مع زيادة عدد مستويات الروابط وحجم القاعدة ، هناك انخفاض في الأداء. وكلما أصبحت العلاقات أكثر تعقيدًا ، زاد عدد الروابط المشتركة أيضًا.
بالطبع ، هناك حلول في النموذج العلائقي للعمل مع التسلسلات الهرمية (على سبيل المثال ، استخدام CTE العودية) ، ولكن لا تزال هذه الحلول. في الوقت نفسه ، تتيح لك وظيفة قواعد بيانات الرسم البياني لـ SQL Server معالجة عدة مستويات من التسلسل الهرمي بسهولة. تم تبسيط نموذج البيانات والاستعلامات وبالتالي فهي أكثر كفاءة. يتم تقليل مقدار التعليمات البرمجية بشكل كبير.
قواعد بيانات الرسم البياني هي لغة تعبيرية لتمثيل الأنظمة المعقدة. تُستخدم هذه التقنية بالفعل على نطاق واسع في صناعة تكنولوجيا المعلومات في مجالات مثل وسائل التواصل الاجتماعي وأنظمة مكافحة الاحتيال وتحليل شبكة تكنولوجيا المعلومات والتوصيات الاجتماعية وتوصيات المنتج والمحتوى.
تعد وظيفة قاعدة بيانات الرسم البياني في SQL Server مناسبة للسيناريوهات التي يتم فيها ربط البيانات بإحكام ولها علاقات محددة جيدًا.
نموذج بيانات الرسم البياني
الرسم البياني عبارة عن مجموعة من الرؤوس (العقد) والحواف (العلاقات). تمثل الرؤوس كيانات ، وتمثل الحواف الروابط التي يمكن أن تحتوي سماتها على معلومات.
نماذج قاعدة بيانات الرسم البياني الكيانات في شكل رسم بياني ، كما هو محدد في نظرية الرسم البياني. هياكل البيانات هي رؤوس وحواف. السمات هي خصائص الرؤوس والحواف. الارتباط هو اتصال القمم.
على عكس نماذج البيانات الأخرى ، في قواعد بيانات الرسم البياني ، تحظى العلاقات بين الكيانات بالأولوية. لذلك ، ليست هناك حاجة لحساب العلاقات باستخدام مفاتيح خارجية أو بطريقة أخرى. يمكنك إنشاء نماذج بيانات معقدة باستخدام تجريدات الرأس والحافة فقط.
في العالم الحديث ، تتطلب علاقات النمذجة المزيد والمزيد من التقنيات المتطورة. لنمذجة العلاقات ، يوفر SQL Server 2017 إمكانيات قاعدة بيانات الرسم البياني. يتم تمثيل رؤوس وحواف الرسم البياني كأنواع جديدة من الجداول: NODE و EDGE. يتم استخدام دالة T-SQL جديدة تسمى MATCH () للاستعلام عن الرسم البياني. نظرًا لأن هذه الوظيفة مضمنة في SQL Server 2017 ، يمكن استخدامها في قواعد البيانات الموجودة لديك دون الحاجة إلى أي تحويل.
فوائد نموذج الرسم البياني
اليوم ، تطالب الشركات والمستخدمون على حد سواء بتطبيقات تتعامل مع المزيد والمزيد من البيانات مع توقع الأداء العالي والموثوقية. يقدم عرض البيانات في شكل رسم بياني وسيلة ملائمة للتعامل مع العلاقات المعقدة. هذا النهج يحل العديد من المشاكل ويساعدك في الحصول على نتائج ضمن سياق معين.
يبدو أنه في المستقبل ، ستستفيد العديد من التطبيقات من استخدام قواعد بيانات الرسم البياني.
نمذجة البيانات: من نموذج علائقي إلى رسم بياني

مثال
لنلق نظرة على مثال للهيكل التنظيمي مع تسلسل هرمي للموظفين: موظف يقدم تقاريره إلى مدير ، ومدير يقدم تقاريره إلى مدير كبير ، وما إلى ذلك. يمكن أن يحتوي هذا التسلسل الهرمي على أي عدد من المستويات ، اعتمادًا على شركة معينة. ولكن مع زيادة عدد المستويات ، تصبح علاقات الحوسبة في قاعدة البيانات العلائقية أكثر صعوبة. من الصعب تمثيل التسلسل الهرمي للموظفين أو التسلسل الهرمي في التسويق أو اتصالات وسائل التواصل الاجتماعي. دعونا نرى كيف يمكن لـ SQL Graph حل مشكلة التعامل مع مستويات مختلفة من التسلسل الهرمي.
في هذا المثال ، لنقم بعمل نموذج بيانات بسيط. لنقم بإنشاء جدول موظف EMP مع معرف EMPNO وعمود MGR، مع الإشارة إلى معرف مدير (مدير) الموظف. يتم تخزين جميع المعلومات حول التسلسل الهرمي في هذا الجدول ويمكن الاستعلام عنها باستخدام العمودين EMPNO و MGR .

يُظهر الرسم التخطيطي التالي نفس نموذج المخطط الهيكلي مع أربعة مستويات من التداخل في شكل مألوف أكثر. الموظفون هم رؤوس الرسم البياني من جدول 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

الآن دعونا نلقي نظرة على تمثيل بياني لنفس البيانات. لعقدة الموظف العديد من السمات وترتبط بنفسها من خلال علاقة "الطاعة" (EmplReportsTo). EmplReportsTo هو اسم العلاقة.
يمكن أن يحتوي جدول الحافة (EDGE) أيضًا على سمات.

إنشاء جدول العقدة EmpNode
بناء الجملة لإنشاء عقدة بسيط جدًا: أضف "AS NODE" إلى عبارة CREATE TABLE .
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 و MGR . يوضح مخطط المؤسسة كيفية كتابة 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
توجد الكائنات المتعلقة بالرسم البياني في مجلد جداول الرسم البياني. يتم تمييز رمز جدول العقدة بنقطة ، ويتم تمييز رمز جدول الحافة بدائرتين متصلتين (تشبه إلى حد ما النظارات).

تعبير المطابقة
يتم أخذ تعبير MATCH من CQL (لغة Cypher Query). هذه طريقة فعالة للاستعلام عن خصائص الرسم البياني. يبدأ 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'

الاستعلام التالي هو البحث عن موظفين ومديرين من المستوى الثاني لـ Smith. إذا قمت بإزالة جملة WHERE ، فستعرض النتيجة جميع الموظفين.
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. ومع ذلك ، كما ذكرنا ، يحتوي SQL Server 2017 على القيود التالية:
لا يوجد دعم لتعدد الأشكال.
- .
- $from_id $to_id UPDATE.
- (transitive closure), CTE.
- In-Memory OLTP.
- (System-Versioned Temporal Table), .
- NODE EDGE.
- (cross-database queries).
- - (wizard) .
- GUI, Power BI.
: