沈云,資深工程師,微軟解決方案專家
圖形數據庫是什么呢?如果從字面理解是進行圖形處理的數據庫,那么你就錯了。
我們先來解釋什么是圖形數據庫。
圖形數據庫是 NoSQL 數據庫的一種類型,它應用圖形理論存儲實體之間的關系信息。最常見的例子,就是社會網絡中人與人之間的關系。關系型數據庫用于存儲關系型數據的效果并不好,其查詢復雜、緩慢、超出預期,而圖形數據庫的獨特設計恰恰彌補了這個缺陷。
舉個例子:
如圖表示人、城市、餐館三個實體,直接的關系有:人和人誰和誰是朋友的關系,人居住在某個城市的關系,城市和餐館的關系,人和餐館的關系。
按照傳統做法,可以創建 person,Restaurant ,City 表,創建各種關系表。人與人,任何城市,任何餐館,城市和餐館的關系表。
假設我們要查詢某人的朋友喜歡的餐館、居住在同一城市的人喜歡的同一餐館.....是不是感覺有點暈。感覺即需要關聯 n 多張表,還要自我關聯。
為了解決這樣的問題,業界發明了圖形數據庫。而 SQL 2017 和 Azure SQL 現在全面支持圖形數據庫。怎么來實現呢?
見下圖:
新的數據表節點(node)表和 edge(邊緣表) ,節點表表示數據實體,比如人,城市,餐館。
邊緣表表示實體之間的關系。
第一張圖所表示的關系,我們可以用下面代碼創建節點表,注意關鍵詞
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;`
創建邊緣表:
CREATE TABLE likes (rating INTEGER) AS EDGE;
CREATE TABLE friendOf AS EDGE;CREATE TABLE livesIn AS EDGE;
CREATE TABLE locatedIn AS EDGE;
創建好后,可看到數據庫表屬性下,會有一個圖形表出現,node 表和 edge 表表示圖標有所不同:
查詢數據如下
select * from city
select * from person
select *from livesIn
創建好后,可看到數據庫表屬性下,會有一個圖形表出現,node 表和 edge 表表示圖標有所不同:
如圖可以看到:node 表自動生成了 node_id 這列,edge 自動生成了 edge_id,from_id,to_id,后面都加上了唯一標識。這列的屬性是 nvarchar(1000),事實上每張表系統會生成一個 graph_id_,和其他的系統列,這些列都無法訪問,由系統進行管理。見下圖:
邊緣表表示了實體之間的關系,from to 的關系,如果雙向關系,就需要建立兩條。下面進行查詢是這樣的 :
--查找 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);
---注意:使用關鍵字 Match 進行查詢。
通過上面的簡單的語句可以實現在關系型模型下,需要非常復雜的關聯才能得到的結果。并且 SQL 2017 的圖形數據庫與數據庫引擎完全融合,也就是可以使用比如備份,SSIS ,POWERBI 等各種功能。
在應用上可以分析如:社交關系、犯罪追蹤、醫療領域等等。
更多信息請參考:https://docs.microsoft.com/zh-cn/sql/relational-databases/graphs/sql-graph-overview
立即訪問http://market.azure.cn