Skip to content

Commit

Permalink
bold format
Browse files Browse the repository at this point in the history
  • Loading branch information
Vonng committed Jan 2, 2020
1 parent 5a9f4a9 commit 4408677
Show file tree
Hide file tree
Showing 9 changed files with 92 additions and 96 deletions.
11 changes: 6 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
- 作者: [Martin Kleppmann](https://martin.kleppmann.com)
- 原书名称:[《Designing Data-Intensive Application》](http://shop.oreilly.com/product/0636920032175.do)
- 译者:[冯若航]( http://vonng.com/about)fengruohang@outlook.com
- Gitbook地址:[ddia-cn](https://www.gitbook.com/book/vonng/ddia-cn)(需要科学上网)
- 建议使用[Typora](https://www.typora.io)或Gitbook以获取最佳阅读体验。
- Gitbook地址:[ddia-cn](https://www.gitbook.com/book/vonng/ddia-cn)
- 使用[Typora](https://www.typora.io)或Gitbook以获取最佳阅读体验。



Expand All @@ -27,15 +27,13 @@



##

## 前言

> 在我们的社会中,技术是一种强大的力量。数据、软件、通信可以用于坏的方面:不公平的阶级固化,损害公民权利,保护既得利益集团。但也可以用于好的方面:让底层人民发出自己的声音,让每个人都拥有机会,避免灾难。本书献给所有将技术用于善途的人们。
---------

> 计算是一种流行文化,流行文化鄙视历史。 流行文化关乎个体身份和参与感,但与合作无关。流行文化活在当下,也与过去和未来无关。 我认为大部分(为了钱)编写代码的人就是这样的, 他们不知道自己的文化来自哪里。
> 计算是一种流行文化,流行文化鄙视历史。 流行文化关乎个体身份和参与感,但与合作无关。流行文化活在当下,也与过去和未来无关。 我认为大部分(为了钱)编写代码的人就是这样的, 他们不知道自己的文化来自哪里。
>
> ——阿兰·凯接受Dobb博士的杂志采访时(2012年)
Expand Down Expand Up @@ -92,6 +90,9 @@
4. 第一部分前言,ch2校正 by @jiajiadebug
5. 词汇表、后记关于野猪的部分 by @[Chowss](https://github.com/Vonng/ddia/commits?author=Chowss)

https://github.com/Vonng/ddia/pulls)

感谢所有作出贡献,提出意见的朋友们:[Issues](https://github.com/Vonng/ddia/issues)[Pull Requests](https://github.com/Vonng/ddia/pulls)



Expand Down
36 changes: 17 additions & 19 deletions ch1.md

Large diffs are not rendered by default.

25 changes: 12 additions & 13 deletions ch2.md
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@

[^i]: 一个从电子学借用的术语。每个电路的输入和输出都有一定的阻抗(交流电阻)。当你将一个电路的输出连接到另一个电路的输入时,如果两个电路的输出和输入阻抗匹配,则连接上的功率传输将被最大化。阻抗不匹配会导致信号反射及其他问题。

像ActiveRecord和Hibernate这样的**对象关系映射(object-relational mapping, ORM**框架可以减少这个转换层所需的样板代码的数量,但是它们不能完全隐藏这两个模型之间的差异。
像ActiveRecord和Hibernate这样的 **对象关系映射(ORM object-relational mapping)** 框架可以减少这个转换层所需的样板代码的数量,但是它们不能完全隐藏这两个模型之间的差异。

![](img/fig2-1.png)

Expand Down Expand Up @@ -138,9 +138,9 @@ JSON表示比[图2-1](img/fig2-1.png)中的多表模式具有更好的**局部
* 本地化支持——当网站翻译成其他语言时,标准化的列表可以被本地化,使得地区和行业可以使用用户的语言来显示
* 更好的搜索——例如,搜索华盛顿州的慈善家就会匹配这份简介,因为地区列表可以编码记录西雅图在华盛顿这一事实(从“Greater Seattle Area”这个字符串中看不出来)

存储ID还是文本字符串,这是个**副本(duplication)**问题。当使用ID时,对人类有意义的信息(比如单词:Philanthropy)只存储在一处,所有引用它的地方使用ID(ID只在数据库中有意义)。当直接存储文本时,对人类有意义的信息会复制在每处使用记录中。
存储ID还是文本字符串,这是个 **副本(duplication)** 问题。当使用ID时,对人类有意义的信息(比如单词:Philanthropy)只存储在一处,所有引用它的地方使用ID(ID只在数据库中有意义)。当直接存储文本时,对人类有意义的信息会复制在每处使用记录中。

使用ID的好处是,ID对人类没有任何意义,因而永远不需要改变:ID可以保持不变,即使它标识的信息发生变化。任何对人类有意义的东西都可能需要在将来某个时候改变——如果这些信息被复制,所有的冗余副本都需要更新。这会导致写入开销,也存在不一致的风险(一些副本被更新了,还有些副本没有被更新)。去除此类重复是数据库**规范化(normalization)**的关键思想。[^ii]
使用ID的好处是,ID对人类没有任何意义,因而永远不需要改变:ID可以保持不变,即使它标识的信息发生变化。任何对人类有意义的东西都可能需要在将来某个时候改变——如果这些信息被复制,所有的冗余副本都需要更新。这会导致写入开销,也存在不一致的风险(一些副本被更新了,还有些副本没有被更新)。去除此类重复是数据库 **规范化(normalization)** 的关键思想。[^ii]

[^ii]: 关于关系模型的文献区分了几种不同的规范形式,但这些区别几乎没有实际意义。一个经验法则是,如果重复存储了可以存储在一个地方的值,则模式就不是**规范化(normalized)**的。

Expand Down Expand Up @@ -201,7 +201,7 @@ CODASYL中的查询是通过利用遍历记录列和跟随访问路径表在数

#### 关系模型

相比之下,关系模型做的就是将所有的数据放在光天化日之下:一个**关系(表)**只是一个**元组(行)**的集合,仅此而已。如果你想读取数据,它没有迷宫似的嵌套结构,也没有复杂的访问路径。你可以选中符合任意条件的行,读取表中的任何或所有行。你可以通过指定某些列作为匹配关键字来读取特定行。你可以在任何表中插入一个新的行,而不必担心与其他表的外键关系[^iv]
相比之下,关系模型做的就是将所有的数据放在光天化日之下:一个 **关系(表)** 只是一个 **元组(行)** 的集合,仅此而已。如果你想读取数据,它没有迷宫似的嵌套结构,也没有复杂的访问路径。你可以选中符合任意条件的行,读取表中的任何或所有行。你可以通过指定某些列作为匹配关键字来读取特定行。你可以在任何表中插入一个新的行,而不必担心与其他表的外键关系[^iv]

[^iv]: 外键约束允许对修改约束,但对于关系模型这并不是必选项。即使有约束,外键连接在查询时执行,而在CODASYL中,连接在插入时高效完成。

Expand Down Expand Up @@ -252,7 +252,7 @@ if (user && user.name && !user.first_name) {
}
```

另一方面,在“静态类型”数据库模式中,通常会执行以下**迁移(migration)**操作:
另一方面,在“静态类型”数据库模式中,通常会执行以下 **迁移(migration)** 操作:

```sql
ALTER TABLE users ADD COLUMN first_name text;
Expand All @@ -277,7 +277,7 @@ UPDATE users SET first_name = substring_index(name, ' ', 1); -- MySQL

局部性仅仅适用于同时需要文档绝大部分内容的情况。数据库通常需要加载整个文档,即使只访问其中的一小部分,这对于大型文档来说是很浪费的。更新文档时,通常需要整个重写。只有不改变文档大小的修改才可以容易地原地执行。因此,通常建议保持相对小的文档,并避免增加文档大小的写入【9】。这些性能限制大大减少了文档数据库的实用场景。

值得指出的是,为了局部性而分组集合相关数据的想法并不局限于文档模型。例如,Google的Spanner数据库在关系数据模型中提供了同样的局部性属性,允许模式声明一个表的行应该交错(嵌套)在父表内【27】。Oracle类似地允许使用一个称为**多表索引集群表(multi-table index cluster tables)**的类似特性【28】。Bigtable数据模型(用于Cassandra和HBase)中的**列族(column-family)**概念与管理局部性的目的类似【29】。
值得指出的是,为了局部性而分组集合相关数据的想法并不局限于文档模型。例如,Google的Spanner数据库在关系数据模型中提供了同样的局部性属性,允许模式声明一个表的行应该交错(嵌套)在父表内【27】。Oracle类似地允许使用一个称为 **多表索引集群表(multi-table index cluster tables)** 的类似特性【28】。Bigtable数据模型(用于Cassandra和HBase)中的 **列族(column-family)** 概念与管理局部性的目的类似【29】。

[第3章](ch3.md)将还会看到更多关于局部性的内容。

Expand All @@ -299,7 +299,7 @@ UPDATE users SET first_name = substring_index(name, ' ', 1); -- MySQL

## 数据查询语言

当引入关系模型时,关系模型包含了一种查询数据的新方法:SQL是一种**声明式**查询语言,而IMS和CODASYL使用**命令式**代码来查询数据库。那是什么意思?
当引入关系模型时,关系模型包含了一种查询数据的新方法:SQL是一种 **声明式** 查询语言,而IMS和CODASYL使用 **命令式** 代码来查询数据库。那是什么意思?

许多常用的编程语言是命令式的。例如,给定一个动物物种的列表,返回列表中的鲨鱼可以这样写:

Expand Down Expand Up @@ -387,7 +387,7 @@ li.selected > p {

这里的XPath表达式`li[@class='selected']/p`相当于上例中的CSS选择器`li.selected> p`。CSS和XSL的共同之处在于,它们都是用于指定文档样式的声明式语言。

想象一下,必须使用命令式方法的情况会是如何。在Javascript中,使用**文档对象模型(DOM)**API,其结果可能如下所示:
想象一下,必须使用命令式方法的情况会是如何。在Javascript中,使用 **文档对象模型(DOM)** API,其结果可能如下所示:

```js
var liElements = document.getElementsByTagName("li");
Expand Down Expand Up @@ -545,11 +545,11 @@ db.observations.aggregate([
在属性图模型中,每个**顶点(vertex)**包括:

* 唯一的标识符
* 一组**出边(outgoing edges)**
* 一组**入边(ingoing edges)**
* 一组 **出边(outgoing edges)**
* 一组 **入边(ingoing edges)**
* 一组属性(键值对)

每条**边(edge)**包括:
每条 **边(edge)** 包括:

* 唯一标识符
* **边的起点/尾部顶点(tail vertex)**
Expand Down Expand Up @@ -698,7 +698,7 @@ WITH RECURSIVE

三元组存储模式大体上与属性图模型相同,用不同的词来描述相同的想法。不过仍然值得讨论,因为三元组存储有很多现成的工具和语言,这些工具和语言对于构建应用程序的工具箱可能是宝贵的补充。

在三元组存储中,所有信息都以非常简单的三部分表示形式存储(**主语****谓语****宾语**)。例如,三元组**(吉姆, 喜欢 ,香蕉)**中,**吉姆**是主语,**喜欢**是谓语(动词),**香蕉**是对象。
在三元组存储中,所有信息都以非常简单的三部分表示形式存储(**主语****谓语****宾语**)。例如,三元组 **(吉姆, 喜欢 ,香蕉)** 中,**吉姆** 是主语,**喜欢** 是谓语(动词),**香蕉** 是对象。

三元组的主语相当于图中的一个顶点。而宾语是下面两者之一:

Expand Down Expand Up @@ -1037,7 +1037,6 @@ Cypher和SPARQL使用SELECT立即跳转,但是Datalog一次只进行一小步
1. Fons Rademakers: “[ROOT for Big Data Analysis](http://indico.cern.ch/getFile.py/access?contribId=13&resId=0&materialId=slides&confId=246453),” at *Workshop on the Future of Big Data Management*,
London, UK, June 2013.


------

| 上一章 | 目录 | 下一章 |
Expand Down
Loading

0 comments on commit 4408677

Please sign in to comment.