DDIA读书笔记2-数据模型与查询语言

250 阅读4分钟

多数应用使用层层叠叠的数据模型构建。每一层都通过提供一个明确的数据模型隐藏低层次的复杂性,这些抽象也就实现了第一章所说的简单性。 本章主要介绍三类数据库:关系数据库、文档型数据库和图数据库。

关系模型和文档型

  • 关系型:数据被组织成关系,每个关系是元组的无序集合。有固定的模式。(SQL是关系模型最著名的数据模型)
  • 文档型:没有明确规定的模式。或者说存在隐式模式,因为读取数据的代码通常会假定一种结构,但这个结构不由数据库强制执行。

采用 NoSQL 数据库的背后有几个驱动因素,其中包括:

  • 需要比关系数据库更好的可伸缩性,包括非常大的数据集或非常高的写入吞吐量
  • 相比商业数据库产品,免费和开源软件更受偏爱
  • 关系模型不能很好地支持一些特殊的查询操作
  • 受挫于关系模型的限制性,渴望一种更具多动态性与表现力的数据模型

对象关系不匹配

image.png 图中用关系模型表示一个“一对多”的简历

表示上图的“简历”,使用关系型时,我们需要一个转换层来把这些表中的数据组织成一个对象,虽然可以借助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” 数据存储在两个主要方向上存在分歧:

  1. 文档数据库 的应用场景是:数据通常是自我包含的,而且文档之间的关系非常稀少。
  2. 图形数据库 用于相反的场景:任意事物都可能与任何事物相关联。

文档数据库和图数据库有一个共同点,那就是它们通常不会为存储的数据强制一个模式,这可以使应用程序更容易适应不断变化的需求。但是应用程序很可能仍会假定数据具有一定的结构;这只是模式是明确的(写入时强制)还是隐含的(读取时处理)的问题。