《图数据库》——2.1 关系型数据库缺少联系

2.1 关系型数据库缺少联系

图数据库
数十年来,开发者试图使用关系型数据库处理关联的、半结构化的数据集。关系型数据库设计之初是为了处理纸质表格以及表格化结构—有些方面关系型数据库做得非常好—它们试图对这种实际中的特殊联系进行建模。然而讽刺的是,关系型数据库在处理联系上做得却并不好。

联系确实存在于关系型数据库自身的术语中,但只是作为连接表的手段。前面章节在对关联数据的讨论中曾经提到,我们经常需要对连接实体的联系进行语义的区分,同时限制它们的使用。关联关系什么也做不了。更糟糕的是,随着离群数据(outlier data)的成倍地增加,数据集的宏观结构将愈发复杂和不规整,关系模型将造成大量表连接、稀疏行和非空检查逻辑。关系世界中连通性的增强都将转化为连接操作的增加,这会阻碍性能,并使已有的数据库难以响应变化的业务需求。

图2-1展示了一个以客户为中心的、事务型应用程序存储顾客订单的关系模式(relational schema)。

这种schema的设计对该应用程序产生了很大影响,使有些查询非常简单,而有些异常困难。

表连接增加了偶发复杂性,使得业务数据与外键元数据混杂起来。
外键约束增加了额外的开发与维护成本,而目的仅仅是为了让数据库工作。
带有空值列的稀疏表在代码中需要额外检查,尽管schema本身提供了相关 支持。
仅因为想要查看客户买了什么就需要好几个昂贵的连接。
反向查询(reciprocal query)代价更高。查询“客户买了哪些商品?”比查询“有哪些客户买了这个商品?”的代价相对要低,这就是推荐系统的基础。对于这样的需求,可以引入索引(index),然而即使引入索引,“有哪些买了那个商品的客户还买了这个商品?”随着递归程度的增加,递归问题的查询代价变得异常高昂。

关系型数据库在强关联领域做着斗争。让我们通过社交网络领域中一些简单的和不那么简单的查询来理解关系型数据库中关联查询的成本吧。

图2-2展示了一个记录朋友关系的简单的连接表设计。

回答“谁是Bob的朋友?”这个问题很简单,如示例2-1所示。

示例2-1 Bob的朋友

SELECT p1.Person
FROM Person p1 JOIN PersonFriend
ON PersonFriend.FriendID = p1.ID
JOIN Person p2
  ON PersonFriend.PersonID = p2.ID
WHERE p2.Person = 'Bob'

基于这个示例数据,答案是AliceZach。这不是一个代价高昂或困难的查询,因为它使用了WHERE Person.person='Bob',使得返回的行数是可预期的和有限的。

朋友关系不总是自反关系(reflexive relationship),因此在示例2-2中,需要回答示例2-1的反向查询:“谁是Bob的朋友?”

示例2-2 谁的朋友是Bob

SELECT p1.Person
FROM Person p1 JOIN PersonFriend
ON PersonFriend.PersonID = p1.ID
JOIN Person p2
ON PersonFriend.FriendID = p2.ID
WHERE p2.Person = 'Bob'

这个查询的答案是Alice,很遗憾Zach不认为Bob是他的朋友。这个反向查询在实现上也很简单,但是数据库端的花销就略微大些了,因为所有的数据行都在表PersonFreiend中。

我们可以加入索引,然而仍会涉及代价高昂的间接层。当问题是“谁是我的朋友的朋友?”时就更麻烦了。SQL的层级结构使用了递归连接,这使得查询语法和计算都更加复杂,如示例2-3所示。(有些关系型数据库提供这种查询的语法糖—比如Oracle提供了函数CONNECT BY,它可以简化查询语句,但并不能降低底层的计算复杂度。)

示例2-3 Alice的朋友的朋友们

SELECT p1.Person AS PERSON, p2.Person AS FRIEND_OF_FRIEND
FROM PersonFriend pf1 JOIN Person p1
ON pf1.PersonID = p1.ID
JOIN PersonFriend pf2
ON pf2.PersonID = pf1.FriendID
JOIN Person p2
ON pf2.FriendID = p2.ID
WHERE p1.Person = 'Alice' AND pf2.FriendID <> p1.ID

即使只是处理Alice的朋友的朋友们,而不是深入Alice的整个社交网络,这个查询计算也很复杂。当我们试图探究社交网络时,问题则更复杂,代价也更高。虽然“谁是我的朋友的朋友们?”这样的问题还是可能在合理的时间内通过查询得到答案,但是当查询延伸到第4度、第5度或第6度的朋友关系时,由于递归的连表查询使此时的时间空间复杂度非常高,从而使查询的效率严重恶化。

无论试图在关系型数据库中对关联建模还是查询关联,结果都与我们的愿望完全不同。除了之前指出的查询和计算复杂度以外,我们还得去处理schema这个双刃剑。很多时候,schema被证明是死板和脆弱的。死板表现在:我们需要在创建稀疏表的同时在代码中处理异常情况—一切只是因为没有一个能够容纳我们所用到的各类数据的通用的schema。这在增加了耦合的同时也摧毁了其貌似存在的凝聚力。脆弱表现在:当应用程序发生变化时,需要增加额外的工作从一个schema迁移到另一个schema。

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

时间: 2024-11-03 22:00:39

《图数据库》——2.1 关系型数据库缺少联系的相关文章

大数据-怎么统一关系型数据库,非关系型数据库,文件类型以及消息类型(如网页)的接口

问题描述 怎么统一关系型数据库,非关系型数据库,文件类型以及消息类型(如网页)的接口 最近接了个需求,就是要统一如题的各种接口,小弟从来没做过类似的东西.希望各位能给点例子. 解决方案 可以考虑工厂模式和适配器模式

数据库原理:关系型数据库的事务ACID特性

事务是关系型数据库的核心,关系型数据库之所以在过去这几十年里蓬勃发展,和它对事务的支持密 不可分.但所谓成也萧何,败也萧何,随着数据量的爆炸式增长,特别是近几年的大数据的蓬勃发展, 关系型数据库的事务成为了互联网应用的性能瓶颈,NoSQL正是摒弃了关系型数据库事务的某些属性,使 得对于某类特殊应用,其性能是关系型数据库的好多倍. 下面先说说什么是事务吧,事务在英文 中是transaction,和现实世界中的交易很类似,它有如下四个特性: 1.A (Atomicity) 原子性 原子性很容易理解,

关于关系型数据库和非关系型数据库

这篇是转载文章,原文章如下: http://blog.csdn.net/robinjwong/article/details/18502195 1. 关系型数据库 关系型数据库,是指采用了关系模型来组织数据的数据库. 关系模型是在1970年由IBM的研究员E.F.Codd博士首先提出的,在之后的几十年中,关系模型的概念得到了充分的发展并逐渐成为主流数据库结构的主流模型. 简单来说,关系模型指的就是二维表格模型,而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织. 关系模型中常用的概

阿里云新一代关系型数据库 PolarDB 剖析

本文通过描述关系型数据库发展的背景以及云计算的时代特征,分享了数据库计算力的螺旋式上升的进化理念.并且结合阿里云 RDS 产品的发展路径,阐述了自主研发的新一代云托管关系型数据库 PolarDB 的产品整体设计思想,同时也对一些关键技术点进行了解读. 背景 关系型数据库 谈到关系型数据库,在这个知识日新月异的TMT时代,听起来有些"古董",这个起源于半个世纪以前的IT技术,事实上一直处于现代社会科技的核心,支撑着当今世界绝大多数的商业科技文明.CPU.操作系统.数据库这三大核心领域,基

深度解读 | 阿里云新一代关系型数据库 PolarDB

本文通过描述关系型数据库发展的背景以及云计算的时代特征,分享了数据库计算力的螺旋式上升的进化理念,另外结合阿里云 RDS 产品的发展路径,阐述了自主研发的新一代云托管关系型数据库 PolarDB 的产品整体设计思想,对一些关键技术点进行了解读. 关系型数据库 谈到关系型数据库,在这个知识日新月异的 TMT 时代,听起来有些"古董",这个起源于半个世纪以前的 IT 技术,事实上一直处于现代社会科技的核心,支撑着当今世界绝大多数的商业科技文明.CPU.操作系统.数据库这三大核心领域,基本上

【独家】一文读懂非关系型数据库(NoSQL)

前言 NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL". 现代计算系统每天在网络上都会产生庞大的数据量.这些数据有很大一部分是由关系型数据库管理系统(RDBMSs)来处理,其严谨成熟的数学理论基础使得数据建模和应用程序编程更加简单. 但随着信息化的浪潮和互联网的兴起,传统的RDBMS在一些业务上开始出现问题.首先,对数据库存储的容量要求越来越高,单机无法满足需求,很多时候需要用集群来解决问题,而RDBMS由于要支持join,union等操作,一般不支持分

经验之谈:非关系型数据库(NoSql)

最近了解了一点非关系型数据库,觉得这是一个很好的方向,对于大数据方面的处理,非关系型数据库能起到至关重要的地位.这里我主要是整理了一些前辈的经验,仅供参考. 关系型数据库的特点 1.关系型数据库 关系型数据库,是指采用了关系模型来组织数据的数据库. 简单来说,关系模型指的就是二维表格模型,而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织.常见 的关系型数据库有Oracle.Mysql.sql server等等. 2.关系型数据库瓶颈 高并发读写需求 网站的用户并发性非常高,往往达

《图数据库(第2版)》——2.1 关系型数据库缺少联系

2.1 关系型数据库缺少联系 数十年来,开发者试图使用关系型数据库处理关联的.半结构化的数据集.关系型数据库设计之初是为了处理纸质表格以及表格化结构-有些方面关系型数据库做得非常好-它们试图对这种实际中的特殊联系进行建模.然而讽刺的是,关系型数据库在处理联系上做得却并不好. 联系确实存在于关系型数据库自身的术语中,但只出现在建模阶段,作为连接表的手段.前面章节在对关联数据的讨论中曾经提到,我们经常需要对连接实体的联系进行语义的区分,并为其定义权重.关联关系什么也做不了.更糟糕的是,随着离群数据(

阿里云发布自研商用关系型数据库POLARDB

本文讲的是阿里云发布自研商用关系型数据库POLARDB,在企业数据容量环式增长时代,数据库容量小.存储空间扩展缓慢.性能不足,以及扩容升级慢等问题渐显,传统数据库显然已难以支撑诸如物联网.新金融.新零售.新制造.电信等高吞吐场景业务的快速发展. 一场以人类社会数据暴涨驱动的互联网基础设施进化随之而来. 在2017杭州云栖大会前夕的9月21日,阿里云正式发布了自研新一代商用关系型云数据库POLARDB,该数据库采用第三代分布式共享存储架构,创新实现企业级OLTP与OLAP一体化数据库系统整体设计,