多数应用使用层层叠叠的数据模型构建。每一层都通过提供一个明确的数据模型隐藏低层次的复杂性,这些抽象也就实现了第一章所说的简单性。 本章主要介绍三类数据库:关系数据库、文档型数据库和图数据库。
关系模型和文档型
- 关系型:数据被组织成关系,每个关系是元组的无序集合。有固定的模式。(SQL是关系模型最著名的数据模型)
- 文档型:没有明确规定的模式。或者说存在隐式模式,因为读取数据的代码通常会假定一种结构,但这个结构不由数据库强制执行。
采用 NoSQL 数据库的背后有几个驱动因素,其中包括:
- 需要比关系数据库更好的可伸缩性,包括非常大的数据集或非常高的写入吞吐量
- 相比商业数据库产品,免费和开源软件更受偏爱
- 关系模型不能很好地支持一些特殊的查询操作
- 受挫于关系模型的限制性,渴望一种更具多动态性与表现力的数据模型
对象关系不匹配
图中用关系模型表示一个“一对多”的简历
表示上图的“简历”,使用关系型时,我们需要一个转换层来把这些表中的数据组织成一个对象,虽然可以借助ORM框架,它不能完全隐藏差异。
{ "user_id": 251, "first_name": "Bill", "last_name": "Gates", "summary": "Co-chair of the Bill & Melinda Gates... Active blogger.", "region_id": "us:91", "industry_id": 131, "photo_url": "/p/7/000/253/05b/308dd6e.jpg", "positions": [ { "job_title": "Co-chair", "organization": "Bill & Melinda Gates Foundation" }, { "job_title": "Co-founder, Chairman", "organization": "Microsoft" } ], "education": [ { "school_name": "Harvard University", "start": 1973, "end": 1975 }, { "school_name": "Lakeside School, Seattle", "start": null, "end": null } ], "contact_info": { "blog": "http://thegatesnotes.com", "twitter": "http://twitter.com/BillGates" } }
而这种结构使用JSON文档表示更加适合。
此处使用文档型的好处:
- 更好的局部性,一个文档的内容组织在一起,一次查询即可读出。而关系模型的内容分散在多个表中,需要通过多次查询连接。
- “一对多”关系隐含了树状结构,JSON让这个结构变得明确。
- 减少了阻抗不匹配,不需要进行复杂的ORM。
文档的模式灵活性
无模式可以应对不断变化的需求。
假设你把每个用户的全名存储在一个字段中,而现在想分别存储名字和姓氏【23】。在文档数据库中,只需开始写入具有新字段的新文档,并在应用程序中使用代码来处理读取旧文档的情况。
if (user && user.name && !user.first_name) {
// Documents written before Dec 8, 2013 don't have first_name
user.first_name = user.name.split(" ")[0];
}
而在“静态类型”的数据库模式中,需要进行“迁移”,把过去的老数据都更新到新模式。这种过程往往非常慢,甚至需要停机。
ALTER TABLE users ADD COLUMN first_name text;
UPDATE users SET first_name = split_part(name, ' ', 1); -- PostgreSQL
UPDATE users SET first_name = substring_index(name, ' ', 1); -- MySQL
图数据模型
一个图由两种对象组成:顶点(vertices,也称为 节点,即 nodes,或 实体,即 entities),和 边(edges,也称为 关系,即 relationships,或 弧,即 arcs)。多种数据可以被建模为一个图形。典型的例子包括:
-
社交图谱
顶点是人,边指示哪些人彼此认识。
-
网络图谱
顶点是网页,边缘表示指向其他页面的 HTML 链接。
-
公路或铁路网络
顶点是交叉路口,边线代表它们之间的道路或铁路线。
可以将那些众所周知的算法运用到这些图上:例如,汽车导航系统搜索道路网络中两点之间的最短路径,PageRank 可以用在网络图上来确定网页的流行程度,从而确定该网页在搜索结果中的排名。
小结
新的非关系型 “NoSQL” 数据存储在两个主要方向上存在分歧:
- 文档数据库 的应用场景是:数据通常是自我包含的,而且文档之间的关系非常稀少。
- 图形数据库 用于相反的场景:任意事物都可能与任何事物相关联。
文档数据库和图数据库有一个共同点,那就是它们通常不会为存储的数据强制一个模式,这可以使应用程序更容易适应不断变化的需求。但是应用程序很可能仍会假定数据具有一定的结构;这只是模式是明确的(写入时强制)还是隐含的(读取时处理)的问题。