SQL2017 Azure SQL新功能:图形数据库
圖形數(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è)我們要查詢某人的朋友喜歡的餐館。
假設(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
如圖可以看到: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)域等等。
更多信息請參考:https://docs.microsoft.com/zh-cn/sql/relational-databases/graphs/sql-graph-overview
.NET社區(qū)新聞,深度好文,歡迎訪問公眾號(hào)文章匯總 http://www.csharpkit.com
總結(jié)
以上是生活随笔為你收集整理的SQL2017 Azure SQL新功能:图形数据库的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python和SQL Server 20
- 下一篇: SQL Server 审计