初识SQL Server2017 图数据库(一)
<h2 align="left">背景: <p align="left"> 接下来我会用三个篇幅介绍SQLServer 图数据库以及它的优缺点。 <h2 align="left">介绍: 简单定义:图是NoSQL数据库的一种类型,它应用图形理论存储实体之间的关系信息。图形数据库是一种非关系型数据库,它应用图形理论存储实体之间的关系信息。最常见例子就是社会网络中人与人之间的关系。关系型数据库用于存储“关系型”数据的效果并不好,其查询复杂、缓慢、超出预期,而图形数据库的独特设计恰恰弥补了这个缺陷。
演示环境
创建模型
<p align="left"> 如果想要比较,可以使用下面的脚本创建,或者直接创建图模型。但是,需要用SSMS创建一个新的数据库“GraphExample”。代码如下: <div class="cnblogs_Highlighter"> <pre class="brush:csharp;gutter:true;">create database GraphExample go -- Trying an entire graph model use GraphExample go create schema Forum go create table Forum.ForumMembers (MemberId int not null primary key Identity(1,1),MemberName varchar(100)) go create table Forum.ForumPosts ([PostID] int not null primary key,PostTitle varchar(100),PostBody varchar(100),OwnerID int,ReplyTo int) go Create table Forum.Likes (MemberId int,PostId int) go create table Forum.LikeMember (MemberId int,LikedMemberId int) go INSERT Forum.ForumMembers values('Mike'),('Carl'),('Paul'),('Christy'),('Jennifer'),('Charlie') go INSERT INTO [Forum].[ForumPosts] <p align="left">图模型 <p align="left"> 图模型的计划与关系型模型完全不同。表在图模型中可能是边或者节点。我们需要决定哪些表是边,哪些表是节点。 <p align="left"> 图具有如下特征:
Posts”和“Members”两个实体,‘Reply To’,‘Like’ 和 ‘Written By’三个边。 注意
‘Written By’ 是 ‘Posts’ 和 ‘Members’的关系,可以转化为一个一对多的关系。通过创建一个边的关系表,我们可以用常规的关系表来表现所谓的图模型中的表。也就是组合模式了。 ‘$node_id’的计算字段。我们可以使用这个字段作为主键,SQL Server 允许计算字段作为主键:如果这个主键是一个JSON字段,就不适合作为主键了。因此我们的节点必须包含两个键:业务键,整型字段,以及‘$node_id’ 键,包含整型字段自增长的JSON键。 go CREATE TABLE [dbo].[ForumMembers](
) AS NODE GO CREATE TABLE [dbo].[ForumPosts](
) AS NODE <p align="left">注意 <p align="left"> 在创建对象后,在对象浏览器中检查对象。或许此时注意到一个新的文件夹在‘Tables’文件夹里面叫做‘Graph’。同时也注意到自增字段的名字,尽管我们可以用简称来引用这些字段,例如$node_id,但是真实的字段名称包含了GUID。这个简称字段其实是一个假的名字,称之为“伪列”(可以理解为别名),我们能在查询中使用。 <p align="left"> <img src="https://www.52php.cn/res/2019/01-31/09/3f4f8e5ee73b615d2771e6ff1cede354.png" alt=""> <p align="left"> 如图,插入数据到节点表:我们只需要忽略$node_id,写出插入其他字段的语句即可,语句如下: <div class="cnblogs_Highlighter"> <pre class="brush:csharp;gutter:true;">INSERT ForumMembers values ('Mike'),('Charlie') INSERT INTO [dbo].[ForumPosts]
ForumPosts表的结果。你会发现$node_id字段,是一个JSON字段包含了实体类型和一个自增整型ID,它就是自增长ID。 创建边表 as EDGE CREATE TABLE [dbo].[Likes] AS EDGE CREATE TABLE [dbo].[Reply_To] AS EDGE
$to_id and $from_id 字段对于每条边意味着什么?你可以观察之前定义的边表如何定义的边,这是一种双向的合理选择,使得我们更容易使用和理解。
Written_By:
Likes:
Reply_To:
注意
<p align="left">插入边记录 <p align="left">??? 插入边表的语句需要边的两端ID,$From_id and $To_id。这些字段需要用$node_id的值来填充。例如,对于一个帖子的成员,‘Written_By’包含post 的$node_id 作为$From_id 并且有member的$node_id作为$To_id字段。 <p align="left">下面是插入语句: <div class="cnblogs_Highlighter"> <pre class="brush:csharp;gutter:true;">Insert into Written_By ($to_id,$from_id) values ( (select $node_id from dbo.ForumMembers where MemberId= 1 ),(select $node_id from dbo.ForumPosts where PostID=8 ) ),( (select $node_id from dbo.ForumMembers where MemberId=1 ),(select $node_id from dbo.ForumPosts where PostID=7 ) ),( (select $node_id from dbo.ForumMembers where MemberId= 1 ),(select $node_id from dbo.ForumPosts where PostID= 6) ),( (select $node_id from dbo.ForumMembers where MemberId=5 ),(select $node_id from dbo.ForumPosts where PostID=5 ) ),( (select $node_id from dbo.ForumMembers where MemberId=4 ),(select $node_id from dbo.ForumPosts where PostID=4 ) ),( (select $node_id from dbo.ForumMembers where MemberId=3 ),(select $node_id from dbo.ForumPosts where PostID=3 ) ),(select $node_id from dbo.ForumPosts where PostID=1 ) ),(select $node_id from dbo.ForumPosts where PostID=2 ) ) <p align="left">注意 <p align="left"> 这样插入是不是感觉很麻烦?未来我们可以使用一个对象框架用以支持图对象,目前还不支持这个功能。 <p align="left"> 插入Reply_To脚本如下: <div class="cnblogs_Highlighter"> <pre class="brush:csharp;gutter:true;"> INSERT Reply_To ($to_id,$from_id) VALUES ((SELECT $node_id FROM dbo.ForumPosts WHERE PostID = 4),(SELECT $node_id FROM dbo.ForumPosts WHERE PostID = 6)),((SELECT $node_id FROM dbo.ForumPosts WHERE PostID = 1),(SELECT $node_id FROM dbo.ForumPosts WHERE PostID = 7)),(SELECT $node_id FROM dbo.ForumPosts WHERE PostID = 8)),(SELECT $node_id FROM dbo.ForumPosts WHERE PostID = 2)),((SELECT $node_id FROM dbo.ForumPosts WHERE PostID = 4),(SELECT $node_id FROM dbo.ForumPosts WHERE PostID = 5)),((SELECT $node_id FROM dbo.ForumPosts WHERE PostID = 2),(SELECT $node_id FROM dbo.ForumPosts WHERE PostID = 3))
<p align="left">Likes 边很好的说明了边的功能作用。仅仅插入几个menbers和post表的关系,但是我们可以确定在应用中成员也可能喜欢另一个成员。当然,我们也能用这个边去关联这个成员和其他成员的关系。在关系型模型中我们需要两个表完成这个操作,在图数据库我们只需要一个边。 <p align="left">下面我们在论坛的成员之间插入更多的Like: <div class="cnblogs_code"> VALUES
小结本篇介绍了图数据库的一些简单定义和理解,概述了SQLServer2017中如何创建图数据库的基本步骤和语句。这只是一个初步版本必然有很多缺点,当然也有一些优点,下一篇我将先介绍优点再说一下有哪些不足。 参考文献:https://www.red-gate.com/simple-talk/sql/t-sql-programming/sql-graph-objects-sql-server-2017 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |