1、 11.1.1 关系型数据库的特点关系型数据库的特点 关系型数据库技术的主要特点关系型数据库技术的主要特点:(1)采用强存储模式技术;采用强存储模式技术;(2)采用采用SQL技术标准定义和操作数据库,可以进行技术标准定义和操作数据库,可以进行JOIN等等复杂查询;复杂查询;(3)采用事务处理保证数据一致性。采用事务处理保证数据一致性。SQL支持数据库支持数据库CRUD操作的功能非常强大,是业界的标准操作的功能非常强大,是业界的标准用法。所以,对绝大多数应用来说用法。所以,对绝大多数应用来说关系型数据库关系型数据库都是最有效都是最有效的解决方案,在数据存储方面占据的解决方案,在数据存储方面占据不
2、可动摇的地位不可动摇的地位。DB-Engines排行榜的前四位均为关系型数据库。排行榜的前四位均为关系型数据库。由于受时代特征所限,关系型数据库技术由于受时代特征所限,关系型数据库技术初始设计是基于单初始设计是基于单机集中管理数据机集中管理数据理念。随着信息化的快速发展,它也在服务理念。随着信息化的快速发展,它也在服务器器纵向(纵向(添加内存、硬盘或更强大的添加内存、硬盘或更强大的CPU)和横向()和横向(主从复主从复制、集群和分片制、集群和分片)扩展)扩展方面方面不断努力不断努力。11.1.2 数据下关系型数据库存在的问题数据下关系型数据库存在的问题 随着互联网的发展,各种类型的随着互联网的
3、发展,各种类型的大数据应用层出不穷大数据应用层出不穷:淘宝网每天产生超过淘宝网每天产生超过30亿的店铺和商品浏览信息,亿的店铺和商品浏览信息,8亿在亿在线商品数,上千万的成交、收藏和评价数据,每天活跃数线商品数,上千万的成交、收藏和评价数据,每天活跃数据量超过据量超过50TB;互联网应用在某些集中时间段的高并发问题,平均每秒点互联网应用在某些集中时间段的高并发问题,平均每秒点击量达到几十万次甚至更高。击量达到几十万次甚至更高。大数据下的需求是大数据下的需求是大量数据的存储大量数据的存储、高并发下的快速读写高并发下的快速读写和和数据的多样化数据的多样化。11.1.2 数据下关系型数据库存在的问题
4、数据下关系型数据库存在的问题 关系型数据库在应对上述场景需求时关系型数据库在应对上述场景需求时出现的常见问题出现的常见问题:(1)扩展困难;扩展困难;(2)大量数据的写入问题;大量数据的写入问题;(3)读写慢;读写慢;(4)有限的容量;有限的容量;(5)表结构的变更困难。表结构的变更困难。为了解决大数据下的共性需求,只能由繁入简,放弃关系型为了解决大数据下的共性需求,只能由繁入简,放弃关系型数据库的优势,数据库的优势,在数据模型及完整性、一致性方面做在数据模型及完整性、一致性方面做“减减法法”,而在迫切需要的新特性,而在迫切需要的新特性可扩展性和高并发等方面可扩展性和高并发等方面做做“加法加法
5、”。于是,一种全新的数据库技术于是,一种全新的数据库技术NoSQL应运而生。应运而生。11.2.1 大数据大数据4V特征特征 研究机构研究机构Gartner给给出的大数据定义:出的大数据定义:“大数据大数据”是需要新是需要新处理模式处理模式才能具有更强的决策力、洞察发现力和流程优化能才能具有更强的决策力、洞察发现力和流程优化能力来适应海量、高增长率和多样化的信息资产。力来适应海量、高增长率和多样化的信息资产。麦肯锡麦肯锡全球研究所给出的大数据定义:一种规模大到在获取、全球研究所给出的大数据定义:一种规模大到在获取、存储、管理、分析方面存储、管理、分析方面大大超出了传统数据库软件工具能力大大超出
6、了传统数据库软件工具能力范围的数据集合,并具有:范围的数据集合,并具有:(1)海量海量(Volume)的数据规模的数据规模;(2)快速快速(Velocity)的数据流转的数据流转;(3)多样多样(Variety)的数据类型的数据类型;(4)价值价值(Value)密度低密度低。11.2.2 NoSQL定义定义“NoSQL”实际上是实际上是“Not Only SQL”的缩写的缩写 NoSQL官网对官网对NoSQL的的最新定义是最新定义是:主体符合非关系型、:主体符合非关系型、分布式、开放源码和具有横向扩展能力的下一代数据库。分布式、开放源码和具有横向扩展能力的下一代数据库。11.2.3 NoSQL
7、技术介绍技术介绍1.NoSQL特点特点 (1)采用弱存储模式技术;采用弱存储模式技术;(2)没有采用没有采用SQL技术标准定义和操作数据库;技术标准定义和操作数据库;(3)BASE特性;特性;(4)采用多机分布式技术。采用多机分布式技术。2.大数据下大数据下NoSQL技术的应对效果技术的应对效果 (1)强扩展;强扩展;(2)大量数据的写入问题;大量数据的写入问题;(3)读写速度;读写速度;(4)存储容量;存储容量;(5)表结构的变更。表结构的变更。11.2.3 NoSQL技术介绍技术介绍3.NoSQL技术的缺点技术的缺点 (1)各数据独立设计、无完整性约束,对于复杂业务场景支持各数据独立设计、
8、无完整性约束,对于复杂业务场景支持较差;较差;(2)通用性差通用性差;(3)不支持不支持SQL;(4)现有产品的不够成熟。现有产品的不够成熟。4.NoSQL的数据一致性的数据一致性 分布式处理是分布式处理是NoSQL数据库技术的主要特点之一,而数据库技术的主要特点之一,而一致性一致性、可用性可用性和和分区容忍性分区容忍性是是分布式系统的三个核心需求分布式系统的三个核心需求。如果必。如果必须在三者间做出选择时,如何抉择呢?须在三者间做出选择时,如何抉择呢?CAP理论理论、BASE和和最终一致性最终一致性是是NoSQL技术存在的三大基石技术存在的三大基石,将从技术上解决,将从技术上解决这一问题。这
9、一问题。11.2.3 NoSQL技术介绍技术介绍4.NoSQL的数据一致性的数据一致性 1)CAP理论理论 CAP理论是由理论是由 EricBrewer 教授提出的,在设计和部署分布教授提出的,在设计和部署分布式应用的时候,存在:一致性式应用的时候,存在:一致性(Consistency)、可用性、可用性(Availability)、分区容忍性、分区容忍性(Partition Tolerance)三个核心三个核心的系统需求,这个三个需求之间存在一定的特殊关系。的系统需求,这个三个需求之间存在一定的特殊关系。CAP理论的核心是一个分布式系统不可能同时很好地满足理论的核心是一个分布式系统不可能同时很
10、好地满足CAP这三个核心需求,最多只能同时较好地满足两个这三个核心需求,最多只能同时较好地满足两个。11.2.3 NoSQL技术介绍技术介绍4.NoSQL的数据一致性的数据一致性 1)CAP理论理论 关系型数据库关系型数据库关注的是一致性和可用性,所以可扩展性受限,关注的是一致性和可用性,所以可扩展性受限,满足满足CA原则原则。而大多数。而大多数NoSQL系统都以水平扩展著称,倾系统都以水平扩展著称,倾向于坚持分区容忍性向于坚持分区容忍性,根据其设计理念在一致性和可用性上,根据其设计理念在一致性和可用性上进行选择。进行选择。如果关注一致性如果关注一致性,就需要处理因为系统不可用而导致的写操,就
11、需要处理因为系统不可用而导致的写操作失败的情况,作失败的情况,满足满足CP原则原则,通常性能不是特别高通常性能不是特别高。NoSQL数据库产品数据库产品Redis和和MongoDB都属于都属于CP系统。系统。如果关注可用性如果关注可用性,就要承受系统的读操作可能不能精确地读,就要承受系统的读操作可能不能精确地读取到写操作写入的最新值,取到写操作写入的最新值,满足满足AP原则原则,通常就要对一致性,通常就要对一致性要求低一些。要求低一些。AP原则的数据库系统主要以实现最终一致性来原则的数据库系统主要以实现最终一致性来确保可用性和分区容忍性确保可用性和分区容忍性。11.2.3 NoSQL技术介绍技
12、术介绍4.NoSQL的数据一致性的数据一致性 2)BASE 基本可用基本可用(Basically Availble):系统能够基本运行、一直提:系统能够基本运行、一直提供服务。供服务。软状态软状态(Soft-state):系统可以有一段时间不同步,而不是时:系统可以有一段时间不同步,而不是时时一致保持强一致性,只要最终数据一致即可。时一致保持强一致性,只要最终数据一致即可。最终一致性最终一致性(Eventual consistency):系统需要在某一时刻:系统需要在某一时刻后达到一致性要求。后达到一致性要求。BASE模型完全不同于模型完全不同于ACID模型模型,它,它牺牲高一致性牺牲高一致性
13、,获得可获得可用性用性。例如对于网站评论功能而言,对比可用性和最新的评。例如对于网站评论功能而言,对比可用性和最新的评论是否被看到这样的强一致性,显然并不需要保证强一致性。论是否被看到这样的强一致性,显然并不需要保证强一致性。11.3.1 键值存储模式键值存储模式 关系型数据库适应性强,是关系型数据库适应性强,是通才通才,而,而NoSQL数据库则是解决数据库则是解决某一方面问题或者某个特殊问题的某一方面问题或者某个特殊问题的专才专才。1.键值存储模式的键值存储模式的存储结构存储结构1)键键(Key)键作为唯一标识符,确保一个键值结构中数据记录的唯一性。键作为唯一标识符,确保一个键值结构中数据记
14、录的唯一性。同时键的定义比较自由,例如同时键的定义比较自由,例如“书:计算机:软件:数据库:书:计算机:软件:数据库:9787111433038”。在同一类数据集合里键命名规则应统一。在同一类数据集合里键命名规则应统一。2)值值(Value)值是对应键的数据,通过键来获取。值由二进制大对象值是对应键的数据,通过键来获取。值由二进制大对象(BLOB)存储,可以存放任何类型的数据。与关系型数据库不同,键值无存储,可以存放任何类型的数据。与关系型数据库不同,键值无需预先定义数据类型。需预先定义数据类型。3)键值对键值对(Key-Value)键和值的组合形成键值对,键与值是一一对应关系。键和值的组合形
15、成键值对,键与值是一一对应关系。例如:例如:“书:计算机:软件:数据库:书:计算机:软件:数据库:9787111433038”只能指向只能指向“数数据库基础据库基础”这个值。这个值。4)命名空间命名空间(NameSpace)一类键值对数据构成的集合称为命名空间,以一类键值对数据构成的集合称为命名空间,以区分不同的数据集。命名空间类似于关系型数据库中的表,不过这张表区分不同的数据集。命名空间类似于关系型数据库中的表,不过这张表只有两个字段(键和值)。只有两个字段(键和值)。11.3.1 键值存储模式键值存储模式2.键值数据存储的键值数据存储的分类分类 键值数据库将数据存储于内存,数据容易丢失,无
16、法持久性键值数据库将数据存储于内存,数据容易丢失,无法持久性保存,所以是不能称为真正的数据库。于是,不同的键值数保存,所以是不能称为真正的数据库。于是,不同的键值数据库存储技术出现,根据数据的保存方式分三类。据库存储技术出现,根据数据的保存方式分三类。1)临时性临时性 是将所有数据都保存在内存中,保存和读取的速度非常快,但无是将所有数据都保存在内存中,保存和读取的速度非常快,但无法操作超出内存容量的数据,数据会丢失。如法操作超出内存容量的数据,数据会丢失。如Memcached就是采用此就是采用此类类NoSQL产品。产品。2)永久性永久性 将数据保存在硬盘上,因而数据不会丢失,但性能上还是有差距
17、将数据保存在硬盘上,因而数据不会丢失,但性能上还是有差距的。如的。如ROMA、Tokyo Tyrant、Flare都是此类都是此类NoSQL产品。产品。3)两者兼备两者兼备 这类数据库首先把数据保存在内存中,在满足特定条件的时候这类数据库首先把数据保存在内存中,在满足特定条件的时候将数据写入到硬盘中。这样既确保了内存中数据的处理速度,又可以通将数据写入到硬盘中。这样既确保了内存中数据的处理速度,又可以通过写入硬盘来保证数据的永久。如目前最流行的键值数据库过写入硬盘来保证数据的永久。如目前最流行的键值数据库Redis就是就是此类此类NoSQL产品。产品。11.3.1 键值存储模式键值存储模式3.
18、键值存储模式的键值存储模式的优点优点(1)简单。最大的优势就是数据关系非常简单,存储结构只有键和值,而且简单。最大的优势就是数据关系非常简单,存储结构只有键和值,而且键和值都可以采用自定义结构,适合存储多样性数据。键和值都可以采用自定义结构,适合存储多样性数据。(2)快速。以内存为主的设计思路,能提供非常快的查询速度,非常适合通快速。以内存为主的设计思路,能提供非常快的查询速度,非常适合通过键对数据进行查询和修改等简单操作。更大容量更快速内存能够应对过键对数据进行查询和修改等简单操作。更大容量更快速内存能够应对高并发访问的速度处理能力。高并发访问的速度处理能力。(3)分布式处理。分布式处理可以
19、把分布式处理。分布式处理可以把PB级别的大数据放到几百台级别的大数据放到几百台PC服务器服务器的内存里同时计算,具备了应对大数据的能力。的内存里同时计算,具备了应对大数据的能力。4.键值存储模式的键值存储模式的缺点缺点(1)缺少约束,容易出错。缺少约束,容易出错。(2)对值做查找功能弱。对值做查找功能弱。5.键值数据存储的键值数据存储的应用场合应用场合 适用于适合以键值对存储、数据变化快且数据库大小可预见(适合内存适用于适合以键值对存储、数据变化快且数据库大小可预见(适合内存容量)的应用程序,常应用于股票价格、实时数据搜集、实时通讯、热容量)的应用程序,常应用于股票价格、实时数据搜集、实时通讯
20、、热门网页点击量等系统中。门网页点击量等系统中。11.3.2 文档存储模式文档存储模式 文档存储模式主要解决的不是高性能的并发读写,而是保证文档存储模式主要解决的不是高性能的并发读写,而是保证海量数据存储的同时,具有良好的查询性能和灵活的数据结海量数据存储的同时,具有良好的查询性能和灵活的数据结构。构。以以MongoDB产品为例产品为例介绍文档存储模式的存储结构及特点。介绍文档存储模式的存储结构及特点。1.文档存储模式的文档存储模式的存储结构存储结构1)键值对键值对(Key-Value)由数据和格式组成。数据分键和值两部分,格式根据数据种由数据和格式组成。数据分键和值两部分,格式根据数据种类的
21、不同而不同,如类的不同而不同,如JSON、XML、BSON(Binary JSON)等。等。MongoDB的键值对使用的键值对使用BSON组织数据,支持比组织数据,支持比JSON更多的基本数据类型更多的基本数据类型。键值对的形式是键值对的形式是“键:值键:值”。键一般用字符串表示,值可以。键一般用字符串表示,值可以是基本数据类型,也可以是数组或者文档等带结构的数据。是基本数据类型,也可以是数组或者文档等带结构的数据。11.3.2 文档存储模式文档存储模式2)文档文档(Document)文档是由键值对构成的有序集。文档是由键值对构成的有序集。BSON格式的一个文档如下格式的一个文档如下所示:所示
22、:name:“lemo”,基本数据类型基本数据类型 age:12,嵌入文档嵌入文档 address:city:suzhou,country:china,code:215000,scores:name:English,Grade:80,name:Chinese,Grade:90 数组类型,数组元素又是嵌入文档数组类型,数组元素又是嵌入文档 11.3.2 文档存储模式文档存储模式3)集合集合(Collection)集合是由若干文档构成的对象。一个集合对应的文档应该具集合是由若干文档构成的对象。一个集合对应的文档应该具有相关性。有相关性。每个文档的主键每个文档的主键_id值在同一集合中必须唯一值在同
23、一集合中必须唯一,它是集合中标识该文档的唯一标识符。在文档数据库中,为它是集合中标识该文档的唯一标识符。在文档数据库中,为了便于操作,每个集合都有一个集合名称,用以标识该集合。了便于操作,每个集合都有一个集合名称,用以标识该集合。4)数据库数据库(Database)文档数据库中包含若干集合文档数据库中包含若干集合,在对数据操作之前,必须指定,在对数据操作之前,必须指定数据库名。一台服务器上允许多个数据库并存。数据库名。一台服务器上允许多个数据库并存。11.3.2 文档存储模式文档存储模式2.文档存储模式的文档存储模式的优点优点(1)无表结构无表结构。不需要定义表结构,减少了变更表结构所需要的。
24、不需要定义表结构,减少了变更表结构所需要的开销。不必关心表结构和程序设计之间的一致性,只需保证开销。不必关心表结构和程序设计之间的一致性,只需保证程序正确即可。程序正确即可。(2)灵活的数据结构灵活的数据结构。文档中键值对的键值支持内嵌文档和数组,。文档中键值对的键值支持内嵌文档和数组,数据组织灵活,适合多样性数据的存储。数据组织灵活,适合多样性数据的存储。(3)查询语言强大查询语言强大。几乎可以实现类似关系型数据库单表查询的。几乎可以实现类似关系型数据库单表查询的绝大部分功能,并且像关系型数据库那样支持索引以进行高绝大部分功能,并且像关系型数据库那样支持索引以进行高速处理。速处理。(4)便于
25、扩展便于扩展。可以在多台服务器之间分散数据,便于海量数据。可以在多台服务器之间分散数据,便于海量数据的存储。的存储。11.3.2 文档存储模式文档存储模式3.文档存储模式的文档存储模式的缺点缺点(1)缺少约束缺少约束。去约束去规则化,追求了效率,自然有所牺牲。去约束去规则化,追求了效率,自然有所牺牲。依靠代码保证数据完整性和一致性。依靠代码保证数据完整性和一致性。(2)不支持事务和不支持事务和JOIN查询查询。集合之间没有关联,不支持。集合之间没有关联,不支持JOIN,但为了存储关联关系可以把必要的数据以嵌入文档的形式存但为了存储关联关系可以把必要的数据以嵌入文档的形式存储到文档中。储到文档中
26、。4.文档数据存储的文档数据存储的应用场合应用场合 针对文档数据存储的特点,针对文档数据存储的特点,它适用于它适用于需要存储海量数据、多需要存储海量数据、多样性数据、支持动态查询并且对数据库有性能要求的场合。样性数据、支持动态查询并且对数据库有性能要求的场合。文档存储模式的典型产品有文档存储模式的典型产品有MongoDB和和CouchDB。11.3.3 列族存储模式列族存储模式 列族存储模式是为大数据而生。关系型数据库是以行为基本列族存储模式是为大数据而生。关系型数据库是以行为基本单位的磁盘记录方式,列族存储模式(也以单位的磁盘记录方式,列族存储模式(也以Table为存储结为存储结构)构)以列
27、作为磁盘记录方式以列作为磁盘记录方式,数据按列存储在不同数据块中,数据按列存储在不同数据块中,还可以进一步将多个还可以进一步将多个关系紧密的列并为一个小组作为列族,关系紧密的列并为一个小组作为列族,放在一起存储放在一起存储。擅长以列为单位读取数据。擅长以列为单位读取数据。列族存储模式擅长大数据处理,特别是列族存储模式擅长大数据处理,特别是PB、EB级别的大数级别的大数据存储和从几千台到几万台级别的服务器分布式存储管理,据存储和从几千台到几万台级别的服务器分布式存储管理,体现了更好的可扩展性和高可用性。体现了更好的可扩展性和高可用性。列族存储模式的典型产品有列族存储模式的典型产品有HBase和和
28、Cassandra。11.3.4 图存储模式图存储模式 图存储模式中的图存储模式中的“图图”,不是指,不是指“图片图片”,而是数学图论中,而是数学图论中的的“图图”。因此,。因此,其存储结构的基本要素是节点、边和描述其存储结构的基本要素是节点、边和描述节点、边的属性,以存储图形关系节点、边的属性,以存储图形关系。图存储模式可以存储并处理现实中实体间复杂的关联关系,图存储模式可以存储并处理现实中实体间复杂的关联关系,特定于图论的应用,例如互联网社交关系、交通地图、生物特定于图论的应用,例如互联网社交关系、交通地图、生物研究。通过对节点与节点关系的深入分析,可以发现有价值研究。通过对节点与节点关系
29、的深入分析,可以发现有价值的数据规律,运用于规则推理等方面。的数据规律,运用于规则推理等方面。图存储模式的典型产品是图存储模式的典型产品是Neo科技公司的科技公司的Neo4j。11.4.1 MongoDB安装与配置安装与配置 MongoDB的的安装包安装包可以从它的官网可以从它的官网(https:/)下载下载获得。获得。MongoDB有有收费的企业版(收费的企业版(Enterprise Edition)和免费的社区版)和免费的社区版(Community Edition)两个版本。)两个版本。安装完成后安装完成后,在,在D:MongoDBdatabin路径下看到一系列可路径下看到一系列可执行文件
30、,其中执行文件,其中mongod.exe是是MongoDB最核心的最核心的服务器服务器端数据库管理软件,端数据库管理软件,Mongo.exe是客户端是客户端Shell运行支持程运行支持程序,为用户提供了交互式操作数据库统一界面。序,为用户提供了交互式操作数据库统一界面。首先设置首先设置MongoDB环境,然后启动环境,然后启动MongoDB服务服务。具体命令见教材具体命令见教材 Shell不直观,可以采用类似于不直观,可以采用类似于SQL Server的的SSMS的可视的可视化管理工具(如化管理工具(如Robomongo),使得交互式操作更加容易。),使得交互式操作更加容易。11.4.2 Mo
31、ngoDB数据类型数据类型 虽然虽然MongoDB无需定义数据存储结构无需定义数据存储结构,无需明确文档数据,无需明确文档数据类型,类型,但也存在数据类型的概念但也存在数据类型的概念,由程序员通过代码进行控,由程序员通过代码进行控制,制,MongoDB本身不做类型检查和出错提示。本身不做类型检查和出错提示。MongoDB的文档使用的文档使用类似于类似于JSON的的BSON组织数据组织数据。JSON是一种简是一种简单的表示数据的方式,只包含单的表示数据的方式,只包含6种数据类型(种数据类型(Null、布尔、数字、字符串、布尔、数字、字符串、数组及对象),而数组及对象),而BSON还提供日期、还提
32、供日期、32位数字、位数字、64位数字等类型。下位数字等类型。下面对面对MongoDB中的主要数据类型做一简要说明。中的主要数据类型做一简要说明。(1)Null:用于表示空值或不存在的字段。如:用于表示空值或不存在的字段。如:x:null。(2)Undefined:未定义。如:未定义。如:x:undefined。(3)布尔类型布尔类型(Boolean):布尔类型只有两种值,:布尔类型只有两种值,true和和false。(4)32位整数位整数(32-bit integer):Shell不支持此类型,默认会转换成不支持此类型,默认会转换成64位位浮点数。浮点数。(5)64位整数位整数(64-bit
33、 integer):Shell不支持此类型,默认会转换成不支持此类型,默认会转换成64位位浮点数。浮点数。(6)64位浮点数位浮点数(Double):Shell中仅支持这种类型的数。可以使用中仅支持这种类型的数。可以使用NumberInt()或或NumberLong()方法将浮点数转为方法将浮点数转为32位或位或64位整数。位整数。11.4.2 MongoDB数据类型数据类型(7)字符串类型字符串类型(String):使用:使用UTF-8编码的字符编码的字符表示。如:表示。如:x:Hello World 。(8)日期日期(Date):从标准纪元开始的毫秒数。如:从标准纪元开始的毫秒数。如:da
34、te:new Date()。(9)符号符号(Symbol):Shell不支持此类型,将自动转换成字符串。不支持此类型,将自动转换成字符串。(10)正则表达式正则表达式(Regular Expression):文档中可以包含正则表达式,遵:文档中可以包含正则表达式,遵循循JavaScript的语法。正则表达式主要用在查询文档时作为限定条件。的语法。正则表达式主要用在查询文档时作为限定条件。(11)数组数组(Array):值的集合或者列表,与:值的集合或者列表,与JavaSript中的数组表示相同。如:中的数组表示相同。如:x:Shoes,Women,Pumps 。(12)内嵌文档内嵌文档(Emb
35、edded Documents):文档可以作为文档中某个:文档可以作为文档中某个Key的的Value。文档总大小被限制为。文档总大小被限制为16MB。(13)ObjectId:对象:对象id是用于唯一标识一个文档的是用于唯一标识一个文档的ID。在。在MongoDB存储文存储文档时,必须有一个档时,必须有一个_id键,这个键可以是任何类型,默认是键,这个键可以是任何类型,默认是ObjectId。(14)JavaScript:MongoDB的的文档中可以包括文档中可以包括JavaScript代码代码。如:。如:x:function()/*这里是一段这里是一段JavaScript代码代码*/。11.
36、4.3 电商案例的数据模型设计方案电商案例的数据模型设计方案 电商网站实现电商网站实现多功能商品目录系统多功能商品目录系统,该系统不仅要求数据库,该系统不仅要求数据库能够存储海量数据能够存储海量数据,还能够基于特定属性做类似于关系型数,还能够基于特定属性做类似于关系型数据库的据库的商品及该商品不同系列的检索商品及该商品不同系列的检索。因此,。因此,MongoDB成成为不二选择,原因如下。为不二选择,原因如下。(1)文档灵活性:每个文档灵活性:每个MongoDB文档都可以将数据存储为丰富的文档都可以将数据存储为丰富的BSON结构。这就使得结构。这就使得MongoDB对于存储任何对象都非常理想,可
37、以应对对于存储任何对象都非常理想,可以应对每个商品都有若干系列的庞大目录,实现数据多样性的存储设计。每个商品都有若干系列的庞大目录,实现数据多样性的存储设计。(2)动态的模式:每个文档中的动态的模式:每个文档中的BSON结构可以随时进行调整,保证了结构可以随时进行调整,保证了需要修改时数据的灵活性以及易重构性。在需要修改时数据的灵活性以及易重构性。在MongoDB中,这些多重中,这些多重模式可以存储于一个单一的集合中。模式可以存储于一个单一的集合中。(3)有表现力的查询语言:具备基于文档属性进行各类查询的能力。有表现力的查询语言:具备基于文档属性进行各类查询的能力。下面分析下面分析存储商品存储
38、商品和和商品系列信息商品系列信息所需要的数据模型。所需要的数据模型。11.4.3 电商案例的数据模型设计方案电商案例的数据模型设计方案1.商品商品数据模型的设计方案数据模型的设计方案 下面的文档描述集合下面的文档描述集合goodsinfo中一种商品的基本属性信息:中一种商品的基本属性信息:也可设计为也可设计为Shoes,Women,Pumps的数组形式的数组形式 _id:30671,/人工指定人工指定_id键值键值 department:Shoes,category:Shoes/Women/Pumps,brand:Calvin Klein,title:Evening Platform Pump
39、s,description:Perfect for a casual night out or a formal event.,price:298 /假设价格与不同系列无关假设价格与不同系列无关 不同商品的基本属性不完全相同时,不同商品的基本属性不完全相同时,MongoDB支持动态模支持动态模式,文档中的键值对可以随时调整,式,文档中的键值对可以随时调整,不完全相同的文档可共不完全相同的文档可共存于一个集合中存于一个集合中。11.4.3 电商案例的数据模型设计方案电商案例的数据模型设计方案2.商品系列商品系列数据模型的三种设计方案数据模型的三种设计方案 (1)在单一文档中存储一种商品以及它所有
40、的系列信息在单一文档中存储一种商品以及它所有的系列信息。其其优点是优点是能够在单一查询中检索一种商品以及其所有系列,而能够在单一查询中检索一种商品以及其所有系列,而缺点是缺点是可能造成无限制的文档增长(仅受文档最大长度制可能造成无限制的文档增长(仅受文档最大长度制约)。下面文档描述集合约)。下面文档描述集合goodinfo_detail中一种商品及其不中一种商品及其不同商品系列的信息:同商品系列的信息:_id:“30671”,/main item ID /同前同前 price:298,style:size:34,color:red,size:35,color:black /键值是数组,数组元素
41、是文档键值是数组,数组元素是文档 11.4.3 电商案例的数据模型设计方案电商案例的数据模型设计方案2.商品系列商品系列数据模型的三种设计方案数据模型的三种设计方案 (2)创建一个创建一个能够关联到主商品且独立于主商品数据模型的商能够关联到主商品且独立于主商品数据模型的商品系列数据模型品系列数据模型。下面文档描述集合。下面文档描述集合variation中一种商品的中一种商品的不同商品系列的信息:不同商品系列的信息:_id:93284847362823,itemId:30671,/参照商品数据模型的参照商品数据模型的“_id”size:34,color:red 11.4.3 电商案例的数据模型设
42、计方案电商案例的数据模型设计方案2.商品系列商品系列数据模型的三种设计方案数据模型的三种设计方案 (3)在商品系列数据模型中用数组来刻画不同系列的键值,甚至可以分别在商品系列数据模型中用数组来刻画不同系列的键值,甚至可以分别从商品系列的属性和辅助属性出发,分两个类别刻画该系列的不同属性从商品系列的属性和辅助属性出发,分两个类别刻画该系列的不同属性的键值。下面文档描述集合的键值。下面文档描述集合variation_doc中一种商品的不同商品系列的中一种商品的不同商品系列的信息:信息:_id:93284847362823,itemId:30671,/参照商品数据模型的参照商品数据模型的“_id”a
43、ttrs:size:34,color:red,/键值是内嵌文档键值是内嵌文档 sattrs:width:8.0,heelHeight:5.0,后两种设计方案将商品系列数据模型作为独立数据模型,既支持在目录后两种设计方案将商品系列数据模型作为独立数据模型,既支持在目录中展示主商品而且当用户请求一个更详细的产品时也支持对每个系列的中展示主商品而且当用户请求一个更详细的产品时也支持对每个系列的快速查询,同时也可以保证商品以及系列文档的长度是一个可预测大小。快速查询,同时也可以保证商品以及系列文档的长度是一个可预测大小。但是但是去约束化的去约束化的MongoDB数据库无法保证其数据库无法保证其“ite
44、mId”键值与主商品数键值与主商品数据模型中对应键值保持一致,只能通过程序手段控制据模型中对应键值保持一致,只能通过程序手段控制。11.5.1 数据库的基本操作数据库的基本操作1.创建自定义数据库创建自定义数据库 语法:语法:use database_name2.统计某数据库信息统计某数据库信息 语法:语法:db.stats()3.删除数据库删除数据库 语法:语法:db.dropDatabase()4.查看现有数据库查看现有数据库 语法:语法:show dbs 说明:说明:新建的数据库新建的数据库,无法显示出来无法显示出来。只有创建集合插入文档后,才可。只有创建集合插入文档后,才可显示。显示。
45、5.查看当前数据库下的集合名称查看当前数据库下的集合名称 语法:语法:db.getCollectionNames()若要获悉更多关于数据库的操作命令,可用若要获悉更多关于数据库的操作命令,可用db.help()方法显示所有命令。方法显示所有命令。11.5.2 插入文档插入文档MongoDB可以向一个已经存在或者当前不存在的集合中插入文档。可以向一个已经存在或者当前不存在的集合中插入文档。语法:语法:db.collection_name.insert(documemt or array of documents)说明:说明:(1)collection_name是集合名,是集合名,insert是插
46、入文档的操作命令。是插入文档的操作命令。(2)可以插入一条文档或以数组数据类型插入多条文档。可以插入一条文档或以数组数据类型插入多条文档。(3)如果集合名不存在,则第一次插入文档时自动创建该集合。即无需预先如果集合名不存在,则第一次插入文档时自动创建该集合。即无需预先创建集合创建集合。(4)插入一条文档,会自动生成一个插入一条文档,会自动生成一个_id值,也可自行指定,但在同一集合中值,也可自行指定,但在同一集合中必须唯一。必须唯一。(5)键名不能重复键名不能重复,它在一条文档中起唯一作用,且键名是区分大小写的。,它在一条文档中起唯一作用,且键名是区分大小写的。11.5.2 插入文档插入文档例
47、例11.3 插入一条描述商品基本信息的简单文档到集合插入一条描述商品基本信息的简单文档到集合goodsinfo。db.goodsinfo.insert(_id:30671,/自行指定自行指定“_id”键值,没有使用自动生成键值,没有使用自动生成 department:Shoes,category:Shoes/Women/Pumps,brand:Calvin Klein,title:Evening Platform Pumps,description:Perfect for a casual night out or a formal event.,price:298 /假设价格与不同系列无关假
48、设价格与不同系列无关 )例例11.4 例例11.6 见教材见教材 11.5.3 查询文档查询文档 在在MongoDB数据库中建立集合并插入文档后,可以用各种数据库中建立集合并插入文档后,可以用各种查询文档命令查看数据。查询文档命令查看数据。语法:语法:db.collection_name.find(query,projection)说明:说明:(1)query为查询条件(操作符见表为查询条件(操作符见表11.2),省略该参数则返回),省略该参数则返回所有数据所有数据,query查询条件支持正则表达式。查询条件支持正则表达式。(2)projection用于指定需要返回的字段,省略该参数则返回所用
49、于指定需要返回的字段,省略该参数则返回所有字段。有字段。例例11.7 查询查询variation集合中所有文档。集合中所有文档。db.variation.find()/未指定条件,返回所有数据未指定条件,返回所有数据 11.5.3 查询文档查询文档例例11.8 查询查询variation集合中集合中_id值是值是93284847362823的所有文档。的所有文档。db.variation.find(_id:93284847362823 )若要指定返回字段,则使用若要指定返回字段,则使用projection参数。参数。db.variation.find(_id:93284847362823 ,s
50、ize:1,colord:1 /1表示返回该列表示返回该列,0表示不返回该列表示不返回该列 )/只返回只返回size和和color两列两列 例例11.9 例例11.13 见教材见教材 11.5.4 修改文档修改文档MongoDB可以按照指定的查询条件,修改集合中已存在的文档。可以按照指定的查询条件,修改集合中已存在的文档。语法:语法:db.collection_name.update(,multi:)说明:说明:(1)query为修改的查询条件。为修改的查询条件。(2)update为修改对象文档,含操作符功能的使用。为修改对象文档,含操作符功能的使用。(3)multi为可选参数,默认值是为可选