读图数据库实战笔记02_图数据建模

1. 概念

1.1. 实体

1.1.1. 通常用名词来表示

1.1.2. 描述一个领域中的事物或者事物类型

1.1.2.1. 汽车
1.1.2.2. 用户
1.1.2.3. 地理位置

1.1.3. 在逻辑模型和技术实现过程中,实体通常会变成“顶点”

1.2. 关系

1.2.1. 用动词(或动词短语)来表示

1.2.2. 描述实体之间的互动

1.2.2.1. 一辆卡车移动到一个位置”场景里的移动
1.2.2.2. “一个人加了另一个人为好友”

1.2.3. 在逻辑模型和技术实现过程中,关系通常会变成“边”

1.2.4. 边和关系并不一定是相同的东西。虽然用在概念模型中的实体和关系和用在逻辑模型中的顶点和边经常有很强的相关性,但它们之间并不总是一一对应的

1.3. 属性

1.3.1. 用名词来表示

1.3.2. 通常在实体或关系的上下文中出现,描述实体或关系的特性

1.4. 访问模式

1.4.1. 描述在领域中互动的疑问或方法

1.4.2. 互动疑问

1.4.2.1. 这辆卡车会去哪儿
1.4.2.2. 谁是这个人的好友

1.4.3. 在逻辑模型和技术实现过程中,访问模式通常会变成“查询”

1.5. 基数(cardinality)

1.5.1. 一个集合中元素的数量

1.6. 多重性(multiplicity)

1.6.1. 对一个集合可以拥有的最小基数和最大基数的说明

1.6.2. 一对多、零对多、多对多

1.6.3. 用来约束相关实体的数量

2. 唯一性

2.1. 数据的唯一性指,在一个数据集中,如何度量指定数据重复的次数

2.2. 唯一性被定义为两个顶点之间允许的、具有指定标签的边的数量

2.3. 边的不正确的唯一性定义是图建模过程中最普遍的问题之一,而且经常引发查询问题

2.4. 正确地设计数据模型,以正确反映边的唯一性

2.5. ataStax Enterprise Graph和JanusGraph,会把边的唯一性的显式定义作为模式定义的一部分

2.6. 单独唯一指零条或一条边

2.6.1. 两个实例顶点之间只有唯一具有指定标签的边

2.6.2. 优先使用单独唯一性

2.7. 多重唯一指超过一条边

2.7.1. 两个实例顶点之间可以有一条或多条具有指定标签的边

2.7.2. 只在特殊需要时才考虑多重唯一性

2.8. 单独唯一性显然比多重唯一性普遍得多

2.9. 不恰当的唯一性

2.9.1. 返回太少的数据

2.9.1.1. 当一条边被定义为单独唯一的,但事实上应该是多重唯一的时,就会发生这种情况

2.9.2. 返回重复的数据

2.9.2.1. 当一条边被定义为多重唯一的,但事实上应该是单独唯一的时候,就会发生这种情况

2.9.3. 糟糕的查询性能

2.9.3.1. 用多重唯一的边取代本来可以用单独唯一表示的边是导致查询性能变差的首要原因
2.9.3.1.1. 数据库不得不做更多事情来从一个带有多条边的查询中返回数据

3. 数据建模

3.1. 将真实世界的实体和关系转换为相应的软件表示

3.2. 图数据的建模过程相较于关系数据库,我们的思维方式必须从“实体第一”(更准确地说,是“实体唯一”)转变为“实体加关系”

3.3. 物理数据模型大多数时候就是我们要查询的结果

3.4. 概念模型是最终用户与软件开发人员的沟通桥梁

3.5. 数据设计过程中的失误将在代码实现过程中引起更难修复的问题

3.6. 所有实现都意味着一定程度的代码编写、测试和数据加载

3.7. 构建包含复杂领域中的高度关联数据、可以在生产环境运行的应用程序

3.8. 要采取的方式会降低这种风险,并把数据模型变化所带来的痛苦降到最低

4. 建模步骤

4.1. 理解问题

4.1.1. 昨天的完美应用在明天看来就是功能不全的

4.1.2. 早期在理解业务问题、用例和通用领域术语上进行大量时间投资,是建立好的数据模型的基础

4.1.2.1. 这将降低你在后期大幅修改设计的风险

4.1.3. 领域和范围

4.1.3.1. 每个业务问题都可以无限扩展,所以把范围定义得越精确,我们离成功就越近
4.1.3.2. 定义了业务问题的边界
4.1.3.2.1. 该应用程序能为用户带来什么
4.1.3.2.2. 该应用程序需要记录哪些类型的信息才能完成这些任务
4.1.3.2.3. 谁是应用程序的用户
4.1.3.2.3.1. 聚焦在传统意义的最终用户上
4.1.3.2.3.2. 不包括系统管理员、客户服务人员,以及其他负责对复杂的技术解决方案提供运维的人员

4.1.4. 业务实体

4.1.4.1. 找出应用程序的基础构件,以及这些构件之间的关系
4.1.4.2. 定义良好的关系不仅需要名字,还需要对关系如何连接实体以及定义关系所需的各种潜在属性有一定的理解
4.1.4.3. 这个应用程序会运用哪些要素或事物
4.1.4.4. 这些要素之间有什么关系
4.1.4.5. 每个实体有哪些关键数据

4.1.5. 功能

4.1.5.1. 进入概念模型时,会把功能变成访问模式
4.1.5.1.1. 为系统构建查询
4.1.5.2. 人们将如何使用系统
4.1.5.3. 要为用户解答哪些疑问

4.2. 构建概念数据模型

4.2.1. 白板模型

4.2.2. 花点儿时间理解和定义业务领域是非常重要的

4.2.3. 对实体进行识别和归类

4.2.3.1. 先从领域中提取实体
4.2.3.2. 从寻找名词开始
4.2.3.3. 应该用单数名词来命名所有的实体
4.2.3.3.1. 每个实体代表某项的单个实例
4.2.3.3.2. 对于图数据建模来说,单数的名称更合适

4.2.4. 识别实体间的关系

4.2.4.1. 确定关系,即怎么做
4.2.4.2. 不要小看这种为了聚焦于手头上的首要任务而设的虚拟“想法停车场”
4.2.4.3. 不是在功能性疑问的回答中寻找名词,而是寻找动词
4.2.4.4. 会把每个动词和相应的实体名字进行合并
4.2.4.4.1. 格式是“名词-动词-名词”或“实体-关系-实体”

4.3. 构建逻辑数据模型

4.3.1. 大部分图数据库是没有模式的

4.3.2. 把那些实体和关系转换成图的概念——顶点、边和属性

4.3.3. 步骤

4.3.3.1. 把实体转换成顶点
4.3.3.1.1. 从概念模型中识别所有相关的实体
4.3.3.1.1.1. 作为一个通用规则,我们通过在功能疑问清单中寻找名词的方式来为应用程序找出实体
4.3.3.1.1.2. 因为名词代表实物或逻辑元素,所以它们通常是在应用程序中解决问题所需实体的最佳标识
4.3.3.1.2. 以标签的形式给顶点一个名字,该标签在图模型中是此类实体的唯一标识
4.3.3.1.2.1. 模型图中的标签用于对代表类似概念的顶点进行分组和归类
4.3.3.1.2.2. 决定标签的名字并不是小事
4.3.3.1.2.3. 好的标签名要简短、清晰和准确
4.3.3.1.2.4. 把顶点的标签命名为单数名词是最佳实践
4.3.3.1.2.5. 尽量用通用的名字作为标签名也是一种最佳实践
4.3.3.1.2.6. 标签和属性命名规则的一致性对于应用程序的维护至关重要
4.3.3.1.2.7. 一致性为开发人员和系统管理员提供了可预测性
4.3.3.1.2.8. 统一使用小写单数单词作为标签的名字
4.3.3.1.2.9. 在图数据库中,每个顶点仅关联一个标签通常是比较稳妥的做法

4.3.3.1.2.9.1. 这是Apache TinkerPop项目的做法

4.3.3.1.2.9.1.1. Neo4j和Amazon Nepture,支持一个顶点有多个标签

4.3.3.1.2.9.2. 模式继承中,一个顶点有多个标签是合适的

4.3.3.2. 把关系转换成边
4.3.3.2.1. 边会包含方向、唯一性这些在关系数据库中没有的特性
4.3.3.2.2. 寻找关系
4.3.3.2.2.1. 从概念数据模型中识别相关的关系
4.3.3.2.3. 命名边的标签
4.3.3.2.3.1. 为边命名,作为图数据模型中某个关系的唯一标签
4.3.3.2.3.2. 边首尾连接的是同一个顶点

4.3.3.2.3.2.1. 这种边叫作环

4.3.3.2.4. 为边分配方向
4.3.3.2.4.1. 以定义始末顶点类型
4.3.3.2.4.2. 从一个顶点(出顶点)出发,到另一个顶点(入顶点)
4.3.3.2.5. 确定边的唯一性
4.3.3.2.5.1. 根据这条边在两个指定顶点间存在的次数,确定边的唯一性
4.3.3.2.5.2. 描述了具有相同标签的边从一个顶点的实例连接到另一个顶点的实例的次数
4.3.3.2.5.3. 描述了两个顶点间允许的、具有指定标签的边的最大数量
4.3.3.2.5.4. 多重唯一(multiple uniqueness)
4.3.3.2.5.5. 单独唯一(single uniqueness)
4.3.3.2.5.6. 并不是在描述一条边的特性,而是在描述一组边的特性
4.3.3.3. 寻找属性,并将其分配到顶点和边上
4.3.3.3.1. 属性是用来描述顶点或边的特性的键-值对
4.3.3.3.2. 和列不同,应用程序不会在图数据库中向属性插入默认值或null值
4.3.3.3.3. 保存null值或为属性赋予默认值是没有必要的
4.3.3.3.4. 为顶点和边都赋予属性的能力,正是图数据库和关系数据库的另一个本质区别

4.4. 检查模型

4.4.1. 顶点和边读起来像一个句子吗?是的

4.4.2. 是否有不同的顶点标签或边标签具有相同的属性?没有

4.4.3. 这个模型看起来合理吗?是的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/108019.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[量化投资-学习笔记003]Python+TDengine从零开始搭建量化分析平台-Grafana画K线图

在前面两个笔记: PythonTDengine从零开始搭建量化分析平台-数据存储 PythonTDengine从零开始搭建量化分析平台-MA均线的多种实现方式 中有提到使用 Grafana 画图,不过画的都是均线。除了均线,Grafana 非常人性的提供了 K线图模块 搭配 TDeng…

设置Ubuntu 20.04的静态IP地址(wifi模式下)

一、引言 自己家用的Ubuntu的,重启后ip地址经常会改变,这个时候就需要我们手动配置静态IP了。 二、优点 给Ubuntu设置一个静态IP地址有以下几个好处: 持久性:静态IP地址是固定不变的,与设备的MAC地址绑定。这意味着…

【C++】STL容器——探究不同 [ 迭代器 ] 种类&在STL中的使用方式(15)

前言 大家好吖,欢迎来到 YY 滴C系列 ,热烈欢迎! 本章主要内容面向接触过C的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! 目录 引言:一.查看STL使用文档时…

网站不被谷歌收录的常见原因及解决办法

现如今的互联网中,流量获取的渠道多种多样,但对于独立站而言,Google仍然是一个重要的流量来源。这是因为Google拥有庞大的用户基础,通过Google可以让潜在用户更容易发现我们的网站。然而,现实情况是,一些网…

OSPF,RIP和BGP的路由汇总

OSPF路由汇总 OSPF的路由汇总需要注意以下两点 1.OSPF的路由汇总仅支持手动汇总 注:距离矢量路由协议支持自动路由汇总,链路状态路由协议仅支持手动路由汇总(OSPF,ISIS) 2.OSPF的路由汇总只在区域边界进行汇总 OSPF的路由汇总…

Linux系统下DHCP服务安装部署和使用实例详解(蜜罐)

目录 一、概述 二、具体配置如下: 一、概述 DHCP :动态主机设置协议(英语:Dynamic Host Configuration Protocol,DHCP)是一个局域网的网络协议,使用UDP协议工作,主要有两个用途&…

虚幻中的网络概述一

前置:在学习完turbo强大佬的多人fps之后发觉自己在虚幻网络方面还有许多基础知识不太清楚,结合安宁Ken大佬与虚幻官方文档进行补足。 补充:官方文档中的描述挺好的,自己只算是搬运和将两者结合加强理解。 学习虚幻中的网络先从虚…

RabbitMQ如何保证消息不丢失呢?

RabbitMQ 是一个流行的消息队列系统,用于在分布式应用程序之间传递消息。要确保消息不会丢失,可以采取以下一些措施: 持久化消息: RabbitMQ 允许你将消息标记为持久化的。这意味着消息将被写入磁盘,即使 RabbitMQ 服务…

JavaScrip的DOM接口

JavaScript的DOM(Document Object Model)是一种接口,它允许程序和脚本动态地访问和更新文档的内容、结构和样式。DOM是一种将HTML或XML文档表示为对象树的标准方式。 在JavaScript中,DOM提供了一种方式来操作HTML或XML文档的元素…

【BUG】Nginx转发失败解决方案

最近在做项目的时候出现了一个问题,琢磨了好久,来浅浅记录一下。 这个项目后端使用的是gateway网关和nacos实现动态的路由,前端使用nginx来管理前端资源,大体流程:浏览器发起请求,经过nginx代理&#xff0c…

Redis -- 基础知识3 数据类型及指令

FLUSHALL:清空所有键值对操作(最好别搞,删库要被绳之以法的) 1.string类型 1.介绍 1.redis的字符串,直接按照二进制进行存储,所以可以存储任何数据,取出时不需要转码 2.redis的string类型,限制大小最大为512M,因为为单线程模型为了操作短平快 2.操作 1.set与get set key value …

软考系列(系统架构师)- 2010年系统架构师软考案例分析考点

试题一 软件系统架构选择 【问题1】(7分) 在实际的软件项目开发中,采用恰当的架构风格是项目成功的保证。请用200字以内的文字说明什么是软件架构风格,并对主程序-子程序和管道-过滤器这两种架构风格的特点进行描述。 软件架构风…

MySQL——九、SQL编程

MySQL 一、触发器1、触发器简介2、创建触发器3、一些常见示例 二、存储过程1、什么是存储过程或者函数2、优点3、存储过程创建与调用 三、存储函数1、存储函数创建和调用2、修改存储函数3、删除存储函数 四、游标1、声明游标2、打开游标3、使用游标4、关闭游标游标案例 一、触发…

linux-vsftp虚拟多用户

目录 1.安装vsftp 2.安装DB工具,能转化普通文件为vsftpd识别数据库加密文件 3.创建登录虚拟用户的名单 4.加密文件 6.需要修改vsftpd的配置文件 7.修改vsftp的配置文件,加载支持虚拟用户模式 8.针对不同用户开启不同权限 9.重启服务 10.测试 安…

Winsows QT5.15安装教程——组件务必要选上Sources

文章目录 1 下载地址2 开始安装2.1 选择一个磁盘空间大的位置安装QT,安装完可能会占用30G以上的空间2.2 选择组件2.3 接下来进入傻瓜式安装 3 QT 组件一览3.1 “Preview”分类下的开发组件3.1.1 编译器模块。3.1.2 “Qt ”分类下的开发组件 1 下载地址 https://www…

pytorch 笔记:KLDivLoss

1 介绍 对于具有相同形状的张量 ypred​ 和 ytrue(ypred​ 是输入,ytrue​ 是目标),定义逐点KL散度为: 为了在计算时避免下溢问题,此KLDivLoss期望输入在对数空间中。如果log_targetTrue,则目标…

【Linux】Linux+Nginx部署项目

🥳🥳Welcome Huihuis Code World ! !🥳🥳 接下来看看由辉辉所写的关于Linux的相关操作吧 目录 🥳🥳Welcome Huihuis Code World ! !🥳🥳 一.单体项目的部署 0.我们需要将要进行部…

Notepad++安装插件和配置快捷键

Notepad是一款轻量级、开源的文件编辑工具,可以编辑、浏览文本文件、二进制文件、.cpp、.java、*.cs等文件。Notepad每隔1个月,就有一个新版本,其官网是: https://github.com/notepad-plus-plus/notepad-plus-plus。这里介绍其插件…

10分钟了解JWT令牌 (JSON Web)

10分钟了解JSON Web令牌(JWT) JSON Web Token(JWT)是目前最流行的跨域身份验证解决方案。今天给大家介绍JWT的原理和用法。 1.跨域身份验证 Internet服务无法与用户身份验证分开。一般过程如下。 1.用户向服务器发送用户名和密码。…

C++系列之list的模拟实现

💗 💗 博客:小怡同学 💗 💗 个人简介:编程小萌新 💗 💗 如果博客对大家有用的话,请点赞关注再收藏 🌞 list的节点类 template struct list_Node { public: list_Node* _prev; list_…