这里说的数据存储模式(Data Storage Schema),也就是数据库分类。通过:http://www.nosql-database.org可以查询到现在的NoSQL种类和数量。
NoSQL数据库存储模式主要涉及数据库建立的存放数据的逻辑结构,通俗的说就是数据结构。基本的数据查插删改等操作,数据处理对象,及在分布式状态下的一些处理模式。
键值(Key-Vaule)数据存储模式:
文档(Document)数据存储模式:
文档数据库(Document Store)和关系型数据库类似,也是建立在对磁盘读写的基础上,但因为首先考虑的是读写性能,因此需要去掉各种传统数据库规则约束,甚至无需事先定义数据存储结构。
文档数据库的基本要素:
键值对(Key-Value Pair):文档数据库数据存储结构的基本形式为键值对形式,具体由数据和格式组成。数据分建和值两部分,格式根据数据种类的不同有所区别,如JSON,XML等。
键一般用字符串表示;值可以用各种数据类型表示,如数字,字符串,日期,布尔值,也可以是更复杂的结构,如数组,文档。
键值对根据数据和格式的复杂程度,可以分为:基本键值对,带结构键值对,多形结构键值对。
基本键值对:键和值都是基本数据类型,例如:
{“customer_id”:“2000000”,
“name”:“Micky”
}
带结构键值对:这里把值带数组或嵌入文档的叫做带结构键值对,例如:
数组:{“customer_id”:“2000000”,
“name”:“Micky”
“goods”:[100001,100002,100003,100004]
}
子文档:{name:"<c语言>",
bookprice:33.2,
adddate:2017-10-1,
allow:true,
baseinf:{ISBN:183838388,press:"清华大学出版社"}//子文档
}
多形结构键值对:又可以称为不规则键值对文档。
文档(Document):文档是由键值对构成的有续集。
图一
上述代码中,每个{}中代表一个文档,总共3个文档,每个文档里的键值对必须唯一。
集合(Collection):集合是由若干条文档构成的对象。一个集合对应的文档应该具有相关性。
在图一中,就是一个集合,我们可以围着个集合取个名字:books
数据库(Database):文档数据库中包含若干个集合,在进行数据操作之前,必须指定数据库名。例如:
db.goodsbaseinf.insert(
[
{ item: "小学生教材",name:"《小学一年级语文(上册)》",price:12},
{ item: "初中生教材",name:"《初中一年级语文(上册)》",price:15},
{ item: "高中生教材",name:"《高中一年级语文(上册)》",price:20},
{ item: "外语教材",name:"《英语全解\nABC(五年级上)》",price:30}
]
)
db为数据库名称,goodsbaseinf为集合名称,insert为插入操作。
基本数据操作方式:
Insert:写入操作
db.goodsbaseinf.insert(
[
{ item: "小学生教材",name:"《小学一年级语文(上册)》",price:12}
]
)
该操作有个特点:db存在用之,不存在建之;集合goodsbaseinf亦如此。
Select:读取查询操作。文档数据库允许进行范围查询。
db.goodsbaseinf.find(
{name:"《C语言编程》"},
{name:1,price:1,_id:0})
Update:修改更新操作
use goodsdb
db.order.insert(
{title:"商品购物单1"
,amount:35,
detail:[{name:"苹果",price:22},{name:"面粉",price:18}]
}
)
db.order.update({title:"商品购物单1"},{$set:{title:"商品购物单2"}}) //改订单名称
db.order.find().pretty()
Remove:删除操作
DB.Books.Remove({"Book_ID":"100004"})
文档存储的优缺点:
优点:
简单:没有数据存储结构定义,不用考虑数据写入时检查各种约束,也不用考虑集合与集合对象之间的关系检查约束。
相对高效: 相对传统关系型数据库。
文档格式处理:遵循文档数据库的格式约束。
查询功能强大:相对键值数据库,其查询接近SQL数据库。
分布式处理:分布式处理能力使其具有很强的可伸缩性。
缺点:
缺少约束容易出错。
数据出现冗余。
相对键值数据库低效
根据其缺点可以看出来,很多查询,排序,统计等功能需要程序员在业务代码进行编程约束。
总结:
面向文档数据库会将数据以文档的形式储存。每个文档都是自包含的数据单元,是一系列数据项的集合。每个数据项都有一个名称与对应的值,值既可以是简单的数据类型,如字符串、数字和日期等;也可以是复杂的类型,如有序列表和关联对象。数据存储的最小单位是文档,同一个表中存储的文档属性可以是不同的,数据可以使用XML、JSON或者JSONB等多种形式存储。
产品:MongoDB、CouchDB、RavenDB
有谁在使用:SAP (MongoDB)、Codecademy (MongoDB)、Foursquare(MongoDB)、NBC News (RavenDB)
适用的场景
1. 日志。企业环境下,每个应用程序都有不同的日志信息。Document-Oriented数据库并没有固定的模式,所以我们可以使用它储存不同的信息。
2. 分析。鉴于它的弱模式结构,不改变模式下就可以储存不同的度量方法及添加新的度量。
不适用场景
在不同的文档上添加事务。Document-Oriented数据库并不支持文档间的事务,如果对这方面有需求则不应该选用这个解决方案。
待续......
列族(Column Families)数据存储模式:
图(Graph)数据存储模式:
资料来源:《NoSQL数据库入门与实践》
网络资源