沈云付枫,資深工程師,微軟解決方案專家
圖形數(shù)據(jù)庫是什么呢驰怎?如果從字面理解是進(jìn)行圖形處理的數(shù)據(jù)庫阐滩,那么你就錯(cuò)了。
我們先來解釋什么是圖形數(shù)據(jù)庫县忌。
圖形數(shù)據(jù)庫是 NoSQL 數(shù)據(jù)庫的一種類型掂榔,它應(yīng)用圖形理論存儲(chǔ)實(shí)體之間的關(guān)系信息。最常見的例子芹枷,就是社會(huì)網(wǎng)絡(luò)中人與人之間的關(guān)系衅疙。關(guān)系型數(shù)據(jù)庫用于存儲(chǔ)關(guān)系型數(shù)據(jù)的效果并不好,其查詢復(fù)雜鸳慈、緩慢、超出預(yù)期喧伞,而圖形數(shù)據(jù)庫的獨(dú)特設(shè)計(jì)恰恰彌補(bǔ)了這個(gè)缺陷走芋。
舉個(gè)例子:
如圖表示人、城市潘鲫、餐館三個(gè)實(shí)體翁逞,直接的關(guān)系有:人和人誰和誰是朋友的關(guān)系,人居住在某個(gè)城市的關(guān)系溉仑,城市和餐館的關(guān)系挖函,人和餐館的關(guān)系。
按照傳統(tǒng)做法浊竟,可以創(chuàng)建 person怨喘,Restaurant ,City 表振定,創(chuàng)建各種關(guān)系表必怜。人與人,任何城市后频,任何餐館梳庆,城市和餐館的關(guān)系表暖途。
假設(shè)我們要查詢某人的朋友喜歡的餐館、居住在同一城市的人喜歡的同一餐館.....是不是感覺有點(diǎn)暈膏执。感覺即需要關(guān)聯(lián) n 多張表驻售,還要自我關(guān)聯(lián)。
為了解決這樣的問題更米,業(yè)界發(fā)明了圖形數(shù)據(jù)庫芋浮。而 SQL 2017 和 Azure SQL 現(xiàn)在全面支持圖形數(shù)據(jù)庫。怎么來實(shí)現(xiàn)呢壳快?
見下圖:
新的數(shù)據(jù)表節(jié)點(diǎn)(node)表和 edge(邊緣表) 纸巷,節(jié)點(diǎn)表表示數(shù)據(jù)實(shí)體,比如人眶痰,城市瘤旨,餐館。
邊緣表表示實(shí)體之間的關(guān)系竖伯。
第一張圖所表示的關(guān)系存哲,我們可以用下面代碼創(chuàng)建節(jié)點(diǎn)表,注意關(guān)鍵詞
NODE:
CREATE TABLE Person (ID INTEGER PRIMARY KEY, name VARCHAR(100)) AS NODE;
CREATE TABLE Restaurant (ID INTEGER NOT NULL, name VARCHAR(100), city VARCHAR(100)) AS NODE;
CREATE TABLE City (ID INTEGER PRIMARY KEY, name VARCHAR(100), stateName VARCHAR(100)) AS NODE;`
創(chuàng)建邊緣表:
CREATE TABLE likes (rating INTEGER) AS EDGE;
CREATE TABLE friendOf AS EDGE;CREATE TABLE livesIn AS EDGE;
CREATE TABLE locatedIn AS EDGE;
創(chuàng)建好后七婴,可看到數(shù)據(jù)庫表屬性下祟偷,會(huì)有一個(gè)圖形表出現(xiàn),node 表和 edge 表表示圖標(biāo)有所不同:
查詢數(shù)據(jù)如下
select * from city
select * from person
select *from livesIn
創(chuàng)建好后打厘,可看到數(shù)據(jù)庫表屬性下修肠,會(huì)有一個(gè)圖形表出現(xiàn),node 表和 edge 表表示圖標(biāo)有所不同:
如圖可以看到:node 表自動(dòng)生成了 node_id 這列户盯,edge 自動(dòng)生成了 edge_id,from_id,to_id嵌施,后面都加上了唯一標(biāo)識(shí)。這列的屬性是 nvarchar(1000)莽鸭,事實(shí)上每張表系統(tǒng)會(huì)生成一個(gè) graph_id_吗伤,和其他的系統(tǒng)列,這些列都無法訪問硫眨,由系統(tǒng)進(jìn)行管理足淆。見下圖:
邊緣表表示了實(shí)體之間的關(guān)系,from to 的關(guān)系礁阁,如果雙向關(guān)系巧号,就需要建立兩條。下面進(jìn)行查詢是這樣的 :
--查找 john 的朋友喜歡的餐館
SELECT Restaurant.name
FROM Person person1, Person person2, likes, friendOf,
Restaurant
WHERE MATCH(person1-(friendOf)->person2-(likes)->Restaurant)
AND person1.name='John';
-- 查找在同一城市里面喜歡同一餐館的人
SELECT Person.name FROM Person, likes, Restaurant, livesIn,
City, locatedIn WHERE MATCH (Person-(likes)->Restaurant-
(locatedIn)->City ?AND Person-(livesIn)->City);
---注意:使用關(guān)鍵字 Match 進(jìn)行查詢氮兵。
通過上面的簡單的語句可以實(shí)現(xiàn)在關(guān)系型模型下裂逐,需要非常復(fù)雜的關(guān)聯(lián)才能得到的結(jié)果。并且 SQL 2017 的圖形數(shù)據(jù)庫與數(shù)據(jù)庫引擎完全融合泣栈,也就是可以使用比如備份卜高,SSIS ,POWERBI 等各種功能弥姻。
在應(yīng)用上可以分析如:社交關(guān)系、犯罪追蹤掺涛、醫(yī)療領(lǐng)域等等庭敦。
更多信息請(qǐng)參考:https://docs.microsoft.com/zh-cn/sql/relational-databases/graphs/sql-graph-overview
立即訪問http://market.azure.cn