数据结构论坛

首页 » 分类 » 问答 » 数据模型关系模型和文档模型
TUhjnbcbe - 2021/3/8 18:28:00
北京最专业的白癜风医院 http://yyk.39.net/bj/zhuanke/89ac7.html

(本文阅读难度3颗星)前面的文章我们讲了物联网的架构,在数据存储和分析方面,实际上在云端的系统是一个数据密集型的应用系统。

对于整个系统来说,是通过一层一层叠加数据模型来创建的,因此数据模型可能是开发软件最重要的部分。一般分为以下几层:

1.作为一名应用程序开发人员,观测现实世界,通过对象或数据结构,以及操作这些数据结构的API来对其建模。这些数据结构往往特定与该应用。

2.当需要存储这些数据结构时,可以采用通用数据模型(例如JSON或XML文档,关系数据库中的表或图模型)来表示。

3.数据库工程师接着决定用何种内存,磁盘或网络的字节格式来表示上面的JSON/XML/关系/图形数据。数据表示需要支持多种方式的查询,搜索,操作和处理数据。

4.在更下一层,硬件工程师则需要考虑用电流,光脉冲,磁场等来表示字节。

复杂的应用程序可能会有更多的中间层,例如基于API来构建上层API,但是基本思想相同:每层都通过提供一个简洁的数据模型来隐藏下层的复杂性。这些抽象机制使得不同的人群可以高效协作,例如数据厂商的工程师和使用数据库的应用程序开发人员一起合作。

对于第2点的通用数据模型主要包括关系模型和文档模型。

关系模型的定义:关系模型是由EdgarCodd于年提出的,把数据建模为关系或者表。最著名的关系模型是SQL,数据被组织成关系(Relations),在SQL中称为表(table),其中每个关系都是元组(tuples)的无序集合(在SQL中称为行)。

在使用ER图设计数据库的概念模型之后,我们需要将概念模型转换为可以使用任何RDBMS语言(例如OracleSQL,MySQL等)实现的关系模型。

图1关系模型

文档模型的定义:文档模型将其信息存储在文档中,而不是行和列。通常,数据存储在类似于JSON(JavaScript对象表示法)的结构中。这允许以大多数开发人员熟悉的方式存储数据。它允许每条数据有效地成为对象。一个关键且重要的概念与熟悉的面向对象的编程模式紧密相关。

文档数据库中的数据可以具有动态模式。每个文档可以具有不同的字段,并且字段可以由不同的数据类型表示。在开发过程中可以轻松添加新字段,因此使其非常具有吸引力。这种灵活的动态模式功能通常可以克服无法直接执行多记录事务和JOIN操作的问题。

图2表示为JSON文档

图3一对多树状结构

进一步描述多对多的关系时:

图4多对多结构

数据库中往往有很多信息是需要共享的,如果存储在多个地方,当这些信息需要更新时,那所有的冗余副本也都需要更新,这会导致更多写入开销,并且存在数据不一致的风险,消除这种重复正是数据库规范化的核心思想。然而这种数据规范化需要表达多对一的关系(例如多个人生活在同一地区,多个人在同一个行业工作),这并不是很适合文档模型。对于关系数据库,由于支持联结操作,可以很方便地通过ID来引用其它表中的行,而在文档数据库中,一对多的树状结构不需要联结,支持联结通常也很弱。如果数据库本身不支持联结,则必须在应用程序代码中,通过对数据库进行多次查询来模拟联结。

图4展示了如何定义多对多的关系,每个虚线矩形框内的数据可以组织为一个文档,但是指向组织,学校以及其他用户的关系则需要表示为引用,并且在查询时需要联结操作。相关性使用唯一的标识符引用,该标识符在关系模型中被称为外健,在文档模型中被称为文档引用。标识符可以查询时通过联结操作或相关后续查询来解析。

支持文档数据模型的主要论点是模式灵活性,由于局部性而带来较好的性能,对于某些应用来说,它更接近于应用程序所使用的数据结构。关系模型则强在联结操作,多对一和多对多关系更简洁的表达上,与文档模型抗衡。

如果应用数据具有类似文档的结构(即一对多关系树,通常一次加载整个树),那么使用文档模型更为合适。而关系型模型则倾向于某种数据分解,它把文档结构分解为多个表,有可能使得模式更为笨重,以及不必要的应用代码复杂化。

文档模型也有一定的局限性,例如,不能直接引用文档中的嵌套项,而需要说"用户的职位列表中的第二项"。

在文档数据库中,对联结的支持不足是否是问题取决于应用程序。例如在使用文档数据库记录事件发生时间的应用分析程序中,可能永远不需要多对多关系。但是,如果应用程序确实使用了多对多关系,那么文档模型就变得不太吸引人。通过反规范化来减少对联结的需求,但是应用程序代码需要做额外的工作来保持非规范化数据的一致性。通过向数据库发出多个请求,可以在应用程序代码中模拟联结,但是这也将应用程序变得复杂,并且通常比数据库内的专用代码执行的联结慢。在这些情况下,使用文档模型会导致应用程序代码更复杂,性能更差。

大多数文档数据库不会对文档中的数据强制执行任何模式,这意味着可以将任意的健-值添加到文档中,并且在读取时,客户端无法保证文档可能包含哪些字段。我们可以用读时模式(数据的结构是隐式的,只有在读取时才解释)和写时模式(关系数据的一种传统方法,模式是显示的,并且数据库确保数据写入时都必须遵循)来定义差别。

常用的通过关系模型组织的数据库是MySQL,文档模型数据库是MongoDB。

更多的不同可以参考下表:

参考:

1.《数据密集型应用系统设计》

2.

1
查看完整版本: 数据模型关系模型和文档模型