SqlServer圖形數據庫初體驗

  SQL Server2017新增了一個新功能叫做圖形數據庫。圖形指的拓撲圖形,是一些Node表和Edge表的合集,Node對應關系數據庫中的實體,比如一個人、一個崗位等,Edge表指示Node之前的關系,比如張三在經理崗位。圖形表比較適合用來表示這種實體與實體之間有明顯關聯關系的情況,比如學生和課程,學生是Node表,選課記錄是Edge表。下面以比較常用的角色-任務-操作三層權限管理模型說明圖形表的使用。

  在SSMS中,可以看到數據庫的“表”節點下面有“圖形表”這個節點:

  

  創建圖形表的語句與普通表大體相同,只是在語句最后加上AS NODE或AS EDGE,表示創建的是Node表還是Edge表。創建用戶、角色、任務、操作四張Node表,并插入一些測試數據:

Create Table Roles
(RoleName nvarchar(20) primary key,RoleDesc nvarchar(255)
)
As Node
GoCreate Table Tasks
(TaskName nvarchar(20) primary key,TaskDesc nvarchar(255)
)
As Node
GoCreate Table Opers
(OperName nvarchar(20) primary key,OperDesc nvarchar(255)
)
As Node
GoCreate Table Users
(UserID nvarchar(20) primary key,UserName nvarchar(255)
)
As Node
Go
insert into Roles Values('R001','經理')
insert into Roles Values('R002','庫管員')
insert into Roles Values('R003','出納')
GoInsert into Users Values('U001','張三')
Insert into Users Values('U002','李四')
Insert into Users Values('U003','王五')
GoInsert into Opers Values('C001','操作1')
Insert into Opers Values('C002','操作2')
Insert into Opers Values('C003','操作3')
GoInsert into Tasks Values('T001','任務1')
Insert into Tasks Values('T002','任務2')
Insert into Tasks Values('T003','任務3')
Go

  每一個Node表都有一個偽列$node_id,這個列是SQL Server自動添加且自動填充的。$node_id的值是一段json。

  可以看到實際上的$node_id字段名后面還有一串16進制數字,查詢的時候,使用$node_id作為字段名是可以查詢出來的:

  反而如果用這個字段的全稱$node_id_E42A169EC3FA4F84B5E932FD8B877822,是會報錯:Invalid pseudocolumn "$node_id_E42A169EC3FA4F84B5E932FD8B877822".

  在SSMS中查看表結構:

  還有一個graph_id列,這個列是數據庫內部使用,對我們沒有用。?

  再創建表示用戶-角色對應關系、角色-任務對應關系、任務-操作對應關系的三張Edge表,并插入數據:

Create Table UserRole As Edge
GoCreate Table RoleTask As Edge
GoCreate Table TaskOper As Edge
GoInsert into UserRole Values((select $node_id from Users where UserID='U001'),(select $node_id from Roles where RoleName='R001'))
Insert into UserRole Values((select $node_id from Users where UserID='U002'),(select $node_id from Roles where RoleName='R002'))
Insert into UserRole Values((select $node_id from Users where UserID='U003'),(select $node_id from Roles where RoleName='R003'))
GoInsert into RoleTask Values((select $node_id from Roles where RoleName='R001'),(select $node_id from Tasks where TaskName='T001'))
Insert into RoleTask Values((select $node_id from Roles where RoleName='R002'),(select $node_id from Tasks where TaskName='T002'))
Insert into RoleTask Values((select $node_id from Roles where RoleName='R003'),(select $node_id from Tasks where TaskName='T003'))
GoInsert into TaskOper Values((select $node_id from Tasks where TaskName='T001'),(select $node_id from Opers where OperName='C001'))
Insert into TaskOper Values((select $node_id from Tasks where TaskName='T001'),(select $node_id from Opers where OperName='C001'))
Insert into TaskOper Values((select $node_id from Tasks where TaskName='T001'),(select $node_id from Opers where OperName='C001'))
Go

  上面創建表并沒有寫包含任何字段,因為Edge表包含三個默認列:$edge_id、$from_id、$to_id,分別表示記錄的id值、第一個Node記錄的id、第二個Node記錄的id。這樣,就表示了兩個Node之前有了關聯關系。同樣的,$edge_id也是自動填充。

  查詢角色R001所有的任務:

Select Tasks.TaskName,Tasks.TaskDesc
From Roles,RoleTask,Tasks 
Where Match(Roles-(RoleTask)->Tasks)
And Roles.RoleName='R001'

  

  Match是圖形數據庫查詢的特有語句,使用Node-(Edge)->Node或Ndoe<-(Edge)-Node來表示Node與Node之間有某種關聯。具體語法可以參考https://docs.microsoft.com/en-us/sql/t-sql/queries/match-sql-graph。

  查詢某個用戶的所有操作權限:

Select Opers.OperName,Opers.OperDesc
From Users,UserRole,Roles,RoleTask,Tasks,TaskOper,Opers
Where Match(Users-(UserRole)->Roles-(RoleTask)->Tasks-(TaskOper)->Opers)
And Users.UserID='U001'

  如果用關系型表的方法,就得用類似如下的方法查詢:

select Opers.* from Opers join  TaskOper on TaskOper.OperName=Opers.OperName
join RoleTask on RoleTask.TaskName=TaskOper.TaskName
join UserRole on UserRole.RoleName=RoleTask.RoleName
join Users on Users.UserID=UserRole.UserID
where User.UserID='U001'

  可以看到圖像表的查詢寫法更簡單一些。

轉載于:https://www.cnblogs.com/wangguanguo/p/8602371.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/255176.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/255176.shtml
英文地址,請注明出處:http://en.pswp.cn/news/255176.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

HALCON示例程序dem_trees.hdev提取樹

HALCON示例程序dem_trees.hdev提取樹 示例程序源碼&#xff08;加注釋&#xff09; 關于顯示類函數解釋 dev_close_window () read_image (Mreut, ‘mreut_y’) read_image (MreutDem, ‘mreut_dgm_2.0’) get_image_size (Mreut, Width, Height) dev_open_window (0, 0, Wid…

Oracle CASE WHEN 用法介紹

1. CASE WHEN 表達式有兩種形式 --簡單Case函數 CASE sex WHEN 1 THEN 男 WHEN 2 THEN 女 ELSE 其他 END --Case搜索函數 CASEWHEN sex 1 THEN 男 WHEN sex 2 THEN 女 ELSE 其他 END 2. CASE WHEN 在語句中不同位置的用法 2.1 SELECT CASE WHEN 用法 SELECT grad…

Golang 處理 Json(二):解碼

golang 編碼 json 還比較簡單&#xff0c;而解析 json 則非常蛋疼。不像 PHP 一句 json_decode() 就能搞定。之前項目開發中&#xff0c;為了兼容不同客戶端的需求&#xff0c;請求的 content-type 可以是 json&#xff0c;也可以是 www-x-urlencode。然后某天前端希望某個后端…

五、畸變矯正—讓世界不在扭曲

五、畸變矯正—讓世界不在扭曲 這篇博文所要講述的內容&#xff0c;是標定的主要用途之一&#xff1a;矯正攝像機的畸變。對于圖像畸變矯正的方法&#xff0c;張正友教授也在其大作“A Flexible New Technique forCamera Calibration”中給出。 玉米在這里先為大家介紹一下&…

第二階段個人沖刺08

昨天做了什么&#xff1f; 解決新建項目時會遇到“Your android sdk is out of date or is missing templates”的問題&#xff0c;&#xff0c;實現學生交流區&#xff0c;只有學生和管理員有權查看&#xff0c;教師無權查看的功能 今天要做什么&#xff1f; 實現學生交流區&a…

HALCON示例程序distance_transform.hdev通過distance_transform檢測線的缺陷

HALCON示例程序distance_transform.hdev通過distance_transform檢測線的缺陷 示例程序源碼&#xff08;加注釋&#xff09; 關于顯示類函數解釋 dev_close_window () dev_open_window (0, 0, 400, 400, ‘black’, WindowHandle)通過一系列的坐標點生成多邊形像素輪廓 gen_re…

java面試-Java并發編程(二)——重排序

當我們寫一個單線程程序時&#xff0c;總以為計算機會一行行地運行代碼&#xff0c;然而事實并非如此。 什么是重排序&#xff1f; 重排序指的是編譯器、處理器在不改變程序執行結果的前提下&#xff0c;重新排列指令的執行順序&#xff0c;以達到最佳的運行效率。 重排序分類 …

《MySQL必知必會》[01] 基本查詢

《MySQL必知必會》&#xff08;點擊查看詳情&#xff09;1、寫在前面的話這本書是一本MySQL的經典入門書籍&#xff0c;小小的一本&#xff0c;也受到眾多網友推薦。之前自己學習的時候是啃的清華大學出版社的計算機系列教材《數據庫系統概論》&#xff0c;基礎也算是半罐水&am…

(七)立體標定與立體校正 【計算機視覺學習筆記--雙目視覺幾何框架系列】

七、立體標定與立體校正 這篇博文中&#xff0c;讓玉米和大家一起了解一下&#xff0c;張氏標定是怎樣過渡到立體標定的&#xff1f;在這里主要以雙目立體視覺進行分析。對于雙目立體視覺&#xff0c;我們有兩個攝像頭。它們就像人的一雙眼睛一樣&#xff0c;從不同的方向看世界…

HALCON示例程序edge_segments.hdev提取連續的邊緣段

HALCON示例程序edge_segments.hdev提取連續的邊緣段 示例程序源碼&#xff08;加注釋&#xff09; 關于顯示類函數解釋 dev_update_off () dev_close_window () read_image (Image, ‘mreut’) get_image_size (Image, Width, Height) dev_open_window_fit_image (Image, 0, 0…

讓 jQuery UI draggable 適配移動端

背景&#xff1a; 在移動端&#xff0c;本人要實現對某個元素的拖動&#xff0c;想到使用 jQuery UI 的 draggable 功能。但是發現此插件的拖動只支持PC端&#xff0c;不支持移動端。 原因&#xff1a; 原始的 jQuery UI 里&#xff0c;都是mousedown、mousemove、mouseup來描述…

LAMP(7限定某個目錄禁止解析php、 限制user_agent、 PHP相關配置、PHP擴展模塊

限定某個目錄禁止解析php防止***上傳一個目錄文件php&#xff0c;網站會從而解析php,對我們的網站有很大的危險。因此&#xff0c;我們需要在能上傳文件的目錄直接禁止解析PHP代碼禁止步驟1.編輯虛擬主機配置文件&#xff1a;增添內容核心配置文件內容<Directory /data/wwwr…

編譯器的功能是什么

1、編譯器就是將“一種語言&#xff08;通常為高級語言&#xff09;”翻譯為“另一種語言&#xff08;通常為低級語言&#xff09;”的程序。一個現代編譯器的主要工作流程&#xff1a;源代碼 (source code) → 預處理器(preprocessor) → 編譯器 (compiler) → 目標代碼 (obje…

八、走向三維

八、走向三維 我們前面花了七篇博文做鋪墊&#xff0c;我們所做的一切努力都是為了最后的這一擊——立體成像。因為玉米的這個系列文章是對雙目視覺幾何框架的總結。此處跳過匹配&#xff0c;假設左右圖像點的完美匹配的。只看在幾何上&#xff0c;三維坐標是如何被還原的。相對…

通用連接池項目開啟

通用連接池項目開啟 待完善......轉載于:https://www.cnblogs.com/aresyl/p/5552092.html

HALCON示例程序fin.hdev通過形態學檢測缺陷

HALCON示例程序fin.hdev通過形態學檢測缺陷 示例程序源碼&#xff08;加注釋&#xff09; 關于顯示類函數解釋 dev_update_window (‘off’) read_image (Fins, ‘fin’ [1:3]) get_image_size (Fins, Width, Height) dev_close_window () dev_open_window (0, 0, Width[0],…

FEZ前端模塊化工程開發框架

FEZ FEZ 是面向前端模塊化工程的開發框架。主要目的是統一前端開發模式和項目開發結構&#xff0c;自動化前端工作流&#xff0c;提高開發效率和開發質量。使用持續集成等軟件工程的架構模式&#xff0c;集成眾多業界先進的解決方案&#xff0c;讓研發人員更專注于業務邏輯的實…

棧內存和堆內存

堆和棧這兩個字我們已經接觸多很多次&#xff0c;那么具體是什么存在棧中什么存在堆中呢&#xff1f;就拿JavaScript中的變量來說&#xff1a; 首先JavaScript中的變量分為基本類型和引用類型。 基本類型就是保存在棧內存中的簡單數據段&#xff0c;而引用類型指的是那些保存在…

L~M方法

L~M方法&#xff1a; L~M&#xff08;Levenberg-Marquardt&#xff09;方法有些讓人摸不清頭腦。玉米覺得L~M讓人困擾的主要原因有兩點&#xff1a;一是L~M從何而來、二是L~M怎么樣用&#xff1f;因為玉米也不是研究最優化理論的&#xff0c;所以玉米在這里用較為通俗的觀點&a…

Android——Activity去除標題欄和狀態欄

一、在代碼中設置 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //去除title requestWindowFeature(Window.FEATURE_NO_TITLE); //去掉Activity上面的狀態欄getWindow().setFlags(WindowManager.LayoutParams. FLAG_FULLSC…