Kurs başlamadan önce
Grafik veritabanları, veritabanı uzmanları için önemli bir teknolojidir. Bu alandaki yenilikleri ve yeni teknolojileri takip etmeye çalışıyorum ve ilişkisel ve NoSQL veritabanları ile çalıştıktan sonra grafik veritabanlarının rolünün giderek arttığını görüyorum. Karmaşık hiyerarşik verilerle çalışırken yalnızca geleneksel veritabanları değil, aynı zamanda NoSQL de etkisizdir. Çoğu zaman, bağlantı düzeylerinin sayısındaki ve veritabanının boyutundaki artışla birlikte performansta bir düşüş olur. Ve ilişkiler daha karmaşık hale geldikçe, JOIN'lerin sayısı da artar.
Elbette, ilişkisel modelde hiyerarşilerle çalışmak için çözümler vardır (örneğin, özyinelemeli CTE'ler kullanmak), ancak bunlar yine de geçici çözümlerdir. Aynı zamanda, SQL Server grafik veritabanlarının işlevselliği, birden çok hiyerarşi düzeyini yönetmeyi kolaylaştırır. Hem veri modeli hem de sorgular basitleştirildi ve dolayısıyla verimlilikleri artırıldı. Kod miktarını önemli ölçüde azaltır.
Grafik veritabanları, karmaşık sistemleri temsil etmek için ifade edici bir dildir. Bu teknoloji halihazırda bilişim sektöründe sosyal ağlar, dolandırıcılık önleme sistemleri, BT ağ analizi, sosyal öneriler, ürün ve içerik önerileri gibi alanlarda oldukça yaygın olarak kullanılmaktadır.
SQL Server'daki grafik veritabanı işlevi, verilerin birbirine yüksek oranda bağlı olduğu ve iyi tanımlanmış ilişkilere sahip olduğu senaryolar için uygundur.
Grafik veri modeli
Grafik, köşeler (düğümler, düğüm) ve kenarlar (ilişkiler, kenar) kümesidir. Köşeler varlıkları temsil eder ve kenarlar, nitelikleri bilgi içerebilen bağlantıları temsil eder.
Bir grafik veri tabanı, varlıkları grafik teorisinde tanımlandığı gibi bir grafik olarak modeller. Veri yapıları köşeler ve kenarlardır. Nitelikler, köşelerin ve kenarların özellikleridir. Bir bağlantı, köşelerin bir bağlantısıdır.
Diğer veri modellerinden farklı olarak, grafik veritabanları varlıklar arasındaki ilişkilere öncelik verir. Bu nedenle, ilişkileri yabancı anahtarlar kullanarak veya başka bir şekilde hesaplamaya gerek yoktur. Yalnızca köşe ve kenar soyutlamalarını kullanarak karmaşık veri modelleri oluşturmak mümkündür.
Günümüz dünyasında, modelleme ilişkileri giderek daha karmaşık teknikler gerektiriyor. İlişkileri modellemek için SQL Server 2017, grafik veritabanı yetenekleri sunar. Grafiğin köşeleri ve kenarları yeni tablo türleri olarak temsil edilir: DÜĞÜM ve KENAR. Grafik sorguları, MATCH() adlı yeni bir T-SQL işlevini kullanır. Bu işlevsellik SQL Server 2017'de yerleşik olduğundan, herhangi bir veritabanı dönüştürmesine gerek kalmadan mevcut veritabanlarınızda kullanılabilir.
Grafik Modelin Faydaları
Günümüzde işletmeler ve kullanıcılar, yüksek performans ve güvenilirlik beklerken, giderek daha fazla veriyle çalışan uygulamalar talep ediyor. Verilerin grafik gösterimi, karmaşık ilişkileri ele almak için uygun bir araç sunar. Bu yaklaşım birçok sorunu çözer ve belirli bir bağlamda sonuç alınmasına yardımcı olur.
Görünüşe göre gelecekte birçok uygulama grafik veritabanlarından faydalanacak.
Veri Modelleme: İlişkisel Modellemeden Grafik Modellemeye
Örnek
Çalışan hiyerarşisine sahip bir organizasyon yapısı örneğine bakalım: bir çalışan bir yöneticiye rapor verir, bir yönetici üst düzey bir yöneticiye rapor verir, vb. Belirli şirkete bağlı olarak, bu hiyerarşide herhangi bir sayıda seviye olabilir. Ancak düzey sayısı arttıkça, ilişkisel bir veritabanındaki ilişkileri hesaplamak giderek daha zor hale gelir. Çalışanların hiyerarşisini, pazarlamadaki hiyerarşiyi veya sosyal medya bağlantılarını hayal etmek oldukça zor. SQL Graph'ın farklı hiyerarşi düzeylerini ele alma sorununu nasıl çözebileceğini görelim.
Bu örnek için basit bir veri modeli yapalım. Bir çalışan tablosu oluşturun EMP kimlikli EMPNO ve sütun MGRÇalışanın başkanının (yöneticisinin) kimliğine işaret eden A. Hiyerarşi ile ilgili tüm bilgiler bu tabloda saklanır ve sütunlar kullanılarak sorgulanabilir. EMPNO и MGR.
Aşağıdaki diyagram aynı kuruluş şeması modelini daha tanıdık bir biçimde iç içe geçmenin dört düzeyiyle birlikte göstermektedir. Çalışanlar tablodan grafiğin köşeleridir EMP. "Çalışan" varlığı kendisine "gönderenler" (ReportsTo) ilişkisiyle bağlıdır. Grafik terimleriyle, bir bağlantı, çalışanların düğümlerini (NODE'ler) birbirine bağlayan bir kenardır (EDGE).
Normal bir tablo oluşturalım. EMP ve yukarıdaki şemaya göre oraya değerler ekleyin.
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)
Aşağıdaki şekil çalışanları göstermektedir:
- ile çalışan EMPNO 7369, 7902'ye bağlıdır;
- ile çalışan EMPNO 7902, 7566'ya bağlı
- ile çalışan EMPNO 7566, 7839'ya bağlı
Şimdi aynı verilerin grafik şeklinde temsiline bakalım. EMPLOYEE düğümünün çeşitli öznitelikleri vardır ve kendisine bir "gönderme" ilişkisi (EmplReportsTo) ile bağlıdır. EmplReportsTo, ilişkinin adıdır.
Kenar tablosu (EDGE) ayrıca niteliklere sahip olabilir.
Düğüm tablosu oluşturma EmpNode
Bir düğüm oluşturmak için sözdizimi oldukça basittir: ifadeye TABLO OLUŞTUR sonuna eklendi DÜĞÜM OLARAK.
CREATE TABLE dbo.EmpNode(
ID Int Identity(1,1),
EMPNO NUMERIC(4) NOT NULL,
ENAME VARCHAR(10),
MGR NUMERIC(4),
DNO INT
) AS NODE;
Şimdi verileri normal bir tablodan bir grafiğe dönüştürelim. Sonraki INSERT ilişkisel bir tablodan veri ekler EMP.
INSERT INTO EmpNode(EMPNO,ENAME,MGR,DNO) select empno,ename,MGR,dno from emp
Özel bir sütundaki düğüm tablosunda $node_id_*
ana bilgisayar kimliği JSON olarak saklanır. Bu tablonun geri kalan sütunları, düğümün özniteliklerini içerir.
Kenarlar Oluştur (KENAR)
Kenar tablosu oluşturmak, anahtar kelimenin dışında, düğüm tablosu oluşturmaya çok benzer. KENAR OLARAK.
CREATE TABLE empReportsTo(Deptno int) AS EDGE
Şimdi sütunları kullanarak çalışanlar arasındaki ilişkileri tanımlayalım. EMPNO и MGR. Organizasyon şeması nasıl yazılacağını açıkça gösterir 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 tablosunun varsayılan olarak üç sütunu vardır. Birinci, $edge_id
— JSON biçiminde uç tanımlayıcı. Diğer ikisi ($from_id
и $to_id
) düğümler arasındaki ilişkiyi temsil eder. Ek olarak, kenarlar ek özelliklere sahip olabilir. Bizim durumumuzda, bu Bölüm.
Sistem Görünümleri
sistem görünümünde sys.tables
İki yeni sütun var:
- kenar_kenar
- is_node
SELECT t.is_edge,t.is_node,*
FROM sys.tables t
WHERE name like 'emp%'
ssm'ler
Grafiklerle ilgili nesneler Grafik Tabloları klasöründe bulunur. Düğüm tablosu simgesi bir noktayla, kenar tablosu simgesi ise birbirine bağlı iki daireyle (gözlüğe benzeyen) işaretlenmiştir.
KAÇINCI ifade
ifade MAÇ CQL'den (Cypher Query Language) alınmıştır. Bu, bir grafiğin özelliklerini sorgulamanın etkili bir yoludur. CQL bir ifadeyle başlar MAÇ.
sözdizimi
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
Örnekler
Birkaç örneğe bakalım.
Aşağıdaki sorgu, Smith ve yöneticisinin rapor verdiği çalışanları gösterir.
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'
Aşağıdaki sorgu, Smith için çalışanları ve ikinci düzey yöneticileri bulmak içindir. teklifi kaldırırsanız NEREDE, sonuç olarak tüm çalışanlar görüntülenecektir.
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'
Ve son olarak, üçüncü düzey çalışanlar ve yöneticiler için bir talep.
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'
Şimdi Smith'in patronlarını almak için yön değiştirelim.
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)
Sonuç
SQL Server 2017, çeşitli iş BT ihtiyaçları için eksiksiz bir kurumsal çözüm olarak kendini kanıtlamıştır. SQL Graph'ın ilk sürümü çok umut verici. Bazı sınırlamalara rağmen, grafiklerin olanaklarını keşfetmek için zaten yeterli işlevsellik var.
SQL Graph işlevi, SQL Engine'e tam olarak entegre edilmiştir. Ancak, daha önce de belirtildiği gibi, SQL Server 2017 aşağıdaki sınırlamalara sahiptir:
Polimorfizm için destek yok.
- Yalnızca tek yönlü bağlantılar desteklenir.
- Kenarlar, UPDATE aracılığıyla $from_id ve $to_id sütunlarını güncelleyemez.
- Geçişli kapanışlar desteklenmez, ancak CTE'ler kullanılarak elde edilebilirler.
- Bellek İçi OLTP nesneleri için sınırlı destek.
- Geçici tablolar (Sistem Versiyonlu Geçici Tablo), geçici yerel ve genel tablolar desteklenmez.
- Tablo türleri ve tablo değişkenleri NODE veya EDGE olarak bildirilemez.
- Veritabanları arası sorgular desteklenmez.
- Normal tabloları grafik tablolarına dönüştürmenin doğrudan bir yolu veya bir tür sihirbaz (sihirbaz) yoktur.
- Grafikleri görüntülemek için GUI yoktur, ancak Power BI kullanılabilir.
Daha fazla oku:
Kaynak: habr.com