update text spacing with pandu and some manual adjustments

This commit is contained in:
Gang Yin 2022-01-19 19:42:30 +08:00
parent c7343c4325
commit bf82fb3209
18 changed files with 535 additions and 536 deletions

View File

@ -36,7 +36,7 @@
> 计算是一种流行文化,流行文化鄙视历史。 流行文化关乎个体身份和参与感,但与合作无关。流行文化活在当下,也与过去和未来无关。 我认为大部分(为了钱)编写代码的人就是这样的, 他们不知道自己的文化来自哪里。
>
> ——阿兰·凯接受Dobb博士的杂志采访时2012年)
> —— 阿兰・凯接受 Dobb 博士的杂志采访时2012 年)
## 目录

17
ch2.md
View File

@ -4,7 +4,7 @@
> 语言的边界就是思想的边界。
>
> —— 路德维奇·维特根斯坦《逻辑哲学》1922
> —— 路德维奇维特根斯坦《逻辑哲学》1922
>
-------------------
@ -71,7 +71,7 @@
例如,[图 2-1](img/fig2-1.png) 展示了如何在关系模式中表示简历(一个 LinkedIn 简介)。整个简介可以通过一个唯一的标识符 `user_id` 来标识。像 `first_name``last_name` 这样的字段每个用户只出现一次,所以可以在 User 表上将其建模为列。但是,大多数人在职业生涯中拥有多于一份的工作,人们可能有不同样的教育阶段和任意数量的联系信息。从用户到这些项目之间存在一对多的关系,可以用多种方式来表示:
* 传统 SQL 模型SQL1999 之前)中,最常见的规范化表示形式是将职位,教育和联系信息放在单独的表中,对 User 表提供外键引用,如 [图 2-1](img/fig2-1.png) 所示。
* 后续的SQL标准增加了对结构化数据类型和XML数据的支持;这允许将多值数据存储在单行内并支持在这些文档内查询和索引。这些功能在OracleIBM DB2MS SQL Server和PostgreSQL中都有不同程度的支持【6,7】。JSON数据类型也得到多个数据库的支持包括IBM DB2MySQL和PostgreSQL 【8】。
* 后续的 SQL 标准增加了对结构化数据类型和 XML 数据的支持;这允许将多值数据存储在单行内,并支持在这些文档内查询和索引。这些功能在 OracleIBM DB2MS SQL Server PostgreSQL 中都有不同程度的支持【6,7】。JSON 数据类型也得到多个数据库的支持,包括 IBM DB2MySQL PostgreSQL 【8】。
* 第三种选择是将职业,教育和联系信息编码为 JSON 或 XML 文档,将其存储在数据库的文本列中,并让应用程序解析其结构和内容。这种配置下,通常不能使用数据库来查询该编码列中的值。
对于一个像简历这样自包含文档的数据结构而言JSON 表示是非常合适的:请参阅 [例 2-1]()。JSON 比 XML 更简单。面向文档的数据库(如 MongoDB 【9】RethinkDB 【10】CouchDB 【11】和 Espresso【12】支持这种数据模型。
@ -116,7 +116,7 @@
}
```
有一些开发人员认为JSON模型减少了应用程序代码和存储层之间的阻抗不匹配。不过正如我们将在[第四章](ch4.md)中看到的那样JSON作为数据编码格式也存在问题。缺乏一个模式往往被认为是一个优势;我们将在“[文档模型中的模式灵活性](#文档模型中的模式灵活性)”中讨论这个问题。
有一些开发人员认为 JSON 模型减少了应用程序代码和存储层之间的阻抗不匹配。不过,正如我们将在 [第四章](ch4.md) 中看到的那样JSON 作为数据编码格式也存在问题。缺乏一个模式往往被认为是一个优势;我们将在 “[文档模型中的模式灵活性](#文档模型中的模式灵活性)” 中讨论这个问题。
JSON 表示比 [图 2-1](img/fig2-1.png) 中的多表模式具有更好的 **局部性locality**。如果在前面的关系型示例中获取简介,那需要执行多个查询(通过 `user_id` 查询每个表),或者在 User 表与其下属表之间混乱地执行多路连接。而在 JSON 表示中,所有相关信息都在同一个地方,一个查询就足够了。
@ -265,7 +265,7 @@ UPDATE users SET first_name = substring_index(name, ' ', 1); -- MySQL
大型表上运行 `UPDATE` 语句在任何数据库上都可能会很慢,因为每一行都需要重写。要是不可接受的话,应用程序可以将 `first_name` 设置为默认值 `NULL`,并在读取时再填充,就像使用文档数据库一样。
当由于某种原因(例如,数据是异构的)集合中的项目并不都具有相同的结构时,读时模式更具优势。例如,如果:
当由于某种原因(例如,数据是异构的)集合中的项目并不都具有相同的结构时读时模式更具优势。例如,如果:
* 存在许多不同类型的对象,将每种类型的对象放在自己的表中是不现实的。
* 数据的结构由外部系统决定。你无法控制外部系统且它随时可能变化。
@ -337,7 +337,7 @@ SELECT * FROM animals WHERE family ='Sharks';
SQL 示例不确保任何特定的顺序因此不在意顺序是否改变。但是如果查询用命令式的代码来写的话那么数据库就永远不可能确定代码是否依赖于排序。SQL 相当有限的功能性为数据库提供了更多自动优化的空间。
最后声明式语言往往适合并行执行。现在CPU的速度通过核心(core)的增加变得更快而不是以比以前更高的时钟速度运行【31】。命令代码很难在多个核心和多个机器之间并行化因为它指定了指令必须以特定顺序执行。声明式语言更具有并行执行的潜力因为它们仅指定结果的模式而不指定用于确定结果的算法。在适当情况下数据库可以自由使用查询语言的并行实现【32】。
最后声明式语言往往适合并行执行。现在CPU 的速度通过核心core的增加变得更快而不是以比以前更高的时钟速度运行【31】。命令代码很难在多个核心和多个机器之间并行化因为它指定了指令必须以特定顺序执行。声明式语言更具有并行执行的潜力因为它们仅指定结果的模式而不指定用于确定结果的算法。在适当情况下数据库可以自由使用查询语言的并行实现【32】。
### Web 上的声明式查询
@ -373,7 +373,7 @@ li.selected > p {
}
```
这里的CSS选择器`li.selected> p`声明了我们想要应用蓝色样式的元素的模式:即其直接父元素是具有`selected`CSS类的`<li>`元素的所有`<p>`元素。示例中的元素`<p> Sharks </p>`匹配此模式,但`<p> Whales </p>`不匹配,因为其`<li>`父元素缺少`class =“selected”`
这里的 CSS 选择器 `li.selected > p` 声明了我们想要应用蓝色样式的元素的模式:即其直接父元素是具有 CSS 类 `selected``<li>` 元素的所有 `<p>` 元素。示例中的元素 `<p>Sharks</p>` 匹配此模式,但 `<p>Whales</p>` 不匹配,因为其 `<li>` 父元素缺少 `class="selected"`
如果使用 XSL 而不是 CSS你可以做类似的事情
@ -408,7 +408,7 @@ for (var i = 0; i < liElements.length; i++) {
* 如果选定的类被移除(例如,因为用户点击了不同的页面),即使代码重新运行,蓝色背景也不会被移除 - 因此该项目将保持突出显示,直到整个页面被重新加载。使用 CSS浏览器会自动检测 `li.selected > p` 规则何时不再适用,并在选定的类被移除后立即移除蓝色背景。
* 如果你想要利用新的API例如`document.getElementsBy ClassName“selected”`)甚至`document.evaluate()`来提高性能则必须重写代码。另一方面浏览器供应商可以在不破坏兼容性的情况下提高CSS和XPath的性能。
* 如果你想要利用新的 API例如 `document.getElementsByClassName("selected")` 甚至 `document.evaluate()`)来提高性能,则必须重写代码。另一方面,浏览器供应商可以在不破坏兼容性的情况下提高 CSS XPath 的性能。
在 Web 浏览器中,使用声明式 CSS 样式比使用 JavaScript 命令式地操作样式要好得多。类似地,在数据库中,使用像 SQL 这样的声明式查询语言比使用命令式查询 API 要好得多 [^vi]。
@ -504,7 +504,7 @@ db.observations.aggregate([
]);
```
聚合管道语言与SQL的子集具有类似表现力但是它使用基于JSON的语法而不是SQL的英语句子式语法; 这种差异也许是口味问题。这个故事的寓意是NoSQL系统可能会发现自己意外地重新发明了SQL尽管带着伪装。
聚合管道语言与 SQL 的子集具有类似表现力,但是它使用基于 JSON 的语法而不是 SQL 的英语句子式语法;这种差异也许是口味问题。这个故事的寓意是 NoSQL 系统可能会发现自己意外地重新发明了 SQL尽管带着伪装。
## 图数据模型
@ -981,4 +981,3 @@ Cypher和SPARQL使用SELECT立即跳转但是Datalog一次只进行一小步
| 上一章 | 目录 | 下一章 |
| -------------------------------------------- | ------------------------------- | ---------------------------- |
| [第一章:可靠性、可伸缩性、可维护性](ch1.md) | [设计数据密集型应用](README.md) | [第三章:存储与检索](ch3.md) |

View File

@ -5,7 +5,7 @@
* **异步asynchronous**
不等待某些事情完成(例如,将数据发送到网络中的另一个节点),并且不会假设要花多长时间。请参阅[同步复制与异步复制](ch5.md#同步复制与异步复制)”“[同步网络与异步网络](ch8.md#同步网络与异步网络)”以及“[系统模型与现实](ch8.md#系统模型与现实)”。
不等待某些事情完成(例如,将数据发送到网络中的另一个节点),并且不会假设要花多长时间。请参阅[同步复制与异步复制](ch5.md#同步复制与异步复制)”“[同步网络与异步网络](ch8.md#同步网络与异步网络)”以及“[系统模型与现实](ch8.md#系统模型与现实)”。
* **原子atomic**

View File

@ -36,7 +36,7 @@
> 計算是一種流行文化,流行文化鄙視歷史。 流行文化關乎個體身份和參與感,但與合作無關。流行文化活在當下,也與過去和未來無關。 我認為大部分(為了錢)編寫程式碼的人就是這樣的, 他們不知道自己的文化來自哪裡。
>
> ——阿蘭·凱接受Dobb博士的雜誌採訪時2012年)
> —— 阿蘭・凱接受 Dobb 博士的雜誌採訪時2012 年)
## 目錄

View File

@ -4,7 +4,7 @@
> 語言的邊界就是思想的邊界。
>
> —— 路德維奇·維特根斯坦《邏輯哲學》1922
> —— 路德維奇維特根斯坦《邏輯哲學》1922
>
-------------------
@ -71,7 +71,7 @@
例如,[圖 2-1](../img/fig2-1.png) 展示瞭如何在關係模式中表示簡歷(一個 LinkedIn 簡介)。整個簡介可以透過一個唯一的識別符號 `user_id` 來標識。像 `first_name``last_name` 這樣的欄位每個使用者只出現一次,所以可以在 User 表上將其建模為列。但是,大多數人在職業生涯中擁有多於一份的工作,人們可能有不同樣的教育階段和任意數量的聯絡資訊。從使用者到這些專案之間存在一對多的關係,可以用多種方式來表示:
* 傳統 SQL 模型SQL1999 之前)中,最常見的規範化表示形式是將職位,教育和聯絡資訊放在單獨的表中,對 User 表提供外來鍵引用,如 [圖 2-1](../img/fig2-1.png) 所示。
* 後續的SQL標準增加了對結構化資料型別和XML資料的支援;這允許將多值資料儲存在單行內並支援在這些文件內查詢和索引。這些功能在OracleIBM DB2MS SQL Server和PostgreSQL中都有不同程度的支援【6,7】。JSON資料型別也得到多個數據庫的支援包括IBM DB2MySQL和PostgreSQL 【8】。
* 後續的 SQL 標準增加了對結構化資料型別和 XML 資料的支援;這允許將多值資料儲存在單行內,並支援在這些文件內查詢和索引。這些功能在 OracleIBM DB2MS SQL Server PostgreSQL 中都有不同程度的支援【6,7】。JSON 資料型別也得到多個數據庫的支援,包括 IBM DB2MySQL PostgreSQL 【8】。
* 第三種選擇是將職業,教育和聯絡資訊編碼為 JSON 或 XML 文件,將其儲存在資料庫的文字列中,並讓應用程式解析其結構和內容。這種配置下,通常不能使用資料庫來查詢該編碼列中的值。
對於一個像簡歷這樣自包含文件的資料結構而言JSON 表示是非常合適的:請參閱 [例 2-1]()。JSON 比 XML 更簡單。面向文件的資料庫(如 MongoDB 【9】RethinkDB 【10】CouchDB 【11】和 Espresso【12】支援這種資料模型。
@ -116,7 +116,7 @@
}
```
有一些開發人員認為JSON模型減少了應用程式程式碼和儲存層之間的阻抗不匹配。不過正如我們將在[第四章](ch4.md)中看到的那樣JSON作為資料編碼格式也存在問題。缺乏一個模式往往被認為是一個優勢;我們將在“[文件模型中的模式靈活性](#文件模型中的模式靈活性)”中討論這個問題。
有一些開發人員認為 JSON 模型減少了應用程式程式碼和儲存層之間的阻抗不匹配。不過,正如我們將在 [第四章](ch4.md) 中看到的那樣JSON 作為資料編碼格式也存在問題。缺乏一個模式往往被認為是一個優勢;我們將在 “[文件模型中的模式靈活性](#文件模型中的模式靈活性)” 中討論這個問題。
JSON 表示比 [圖 2-1](../img/fig2-1.png) 中的多表模式具有更好的 **區域性性locality**。如果在前面的關係型示例中獲取簡介,那需要執行多個查詢(透過 `user_id` 查詢每個表),或者在 User 表與其下屬表之間混亂地執行多路連線。而在 JSON 表示中,所有相關資訊都在同一個地方,一個查詢就足夠了。
@ -265,7 +265,7 @@ UPDATE users SET first_name = substring_index(name, ' ', 1); -- MySQL
大型表上執行 `UPDATE` 語句在任何資料庫上都可能會很慢,因為每一行都需要重寫。要是不可接受的話,應用程式可以將 `first_name` 設定為預設值 `NULL`,並在讀取時再填充,就像使用文件資料庫一樣。
當由於某種原因(例如,資料是異構的)集合中的專案並不都具有相同的結構時,讀時模式更具優勢。例如,如果:
當由於某種原因(例如,資料是異構的)集合中的專案並不都具有相同的結構時讀時模式更具優勢。例如,如果:
* 存在許多不同型別的物件,將每種型別的物件放在自己的表中是不現實的。
* 資料的結構由外部系統決定。你無法控制外部系統且它隨時可能變化。
@ -337,7 +337,7 @@ SELECT * FROM animals WHERE family ='Sharks';
SQL 示例不確保任何特定的順序因此不在意順序是否改變。但是如果查詢用命令式的程式碼來寫的話那麼資料庫就永遠不可能確定程式碼是否依賴於排序。SQL 相當有限的功能性為資料庫提供了更多自動最佳化的空間。
最後宣告式語言往往適合並行執行。現在CPU的速度透過核心(core)的增加變得更快而不是以比以前更高的時鐘速度執行【31】。命令程式碼很難在多個核心和多個機器之間並行化因為它指定了指令必須以特定順序執行。宣告式語言更具有並行執行的潛力因為它們僅指定結果的模式而不指定用於確定結果的演算法。在適當情況下資料庫可以自由使用查詢語言的並行實現【32】。
最後宣告式語言往往適合並行執行。現在CPU 的速度透過核心core的增加變得更快而不是以比以前更高的時鐘速度執行【31】。命令程式碼很難在多個核心和多個機器之間並行化因為它指定了指令必須以特定順序執行。宣告式語言更具有並行執行的潛力因為它們僅指定結果的模式而不指定用於確定結果的演算法。在適當情況下資料庫可以自由使用查詢語言的並行實現【32】。
### Web 上的宣告式查詢
@ -373,7 +373,7 @@ li.selected > p {
}
```
這裡的CSS選擇器`li.selected> p`聲明瞭我們想要應用藍色樣式的元素的模式:即其直接父元素是具有`selected`CSS類的`<li>`元素的所有`<p>`元素。示例中的元素`<p> Sharks </p>`匹配此模式,但`<p> Whales </p>`不匹配,因為其`<li>`父元素缺少`class =“selected”`
這裡的 CSS 選擇器 `li.selected > p` 聲明瞭我們想要應用藍色樣式的元素的模式:即其直接父元素是具有 CSS 類 `selected``<li>` 元素的所有 `<p>` 元素。示例中的元素 `<p>Sharks</p>` 匹配此模式,但 `<p>Whales</p>` 不匹配,因為其 `<li>` 父元素缺少 `class="selected"`
如果使用 XSL 而不是 CSS你可以做類似的事情
@ -408,7 +408,7 @@ for (var i = 0; i < liElements.length; i++) {
* 如果選定的類被移除(例如,因為使用者點選了不同的頁面),即使程式碼重新執行,藍色背景也不會被移除 - 因此該專案將保持突出顯示,直到整個頁面被重新載入。使用 CSS瀏覽器會自動檢測 `li.selected > p` 規則何時不再適用,並在選定的類被移除後立即移除藍色背景。
* 如果你想要利用新的API例如`document.getElementsBy ClassName“selected”`)甚至`document.evaluate()`來提高效能則必須重寫程式碼。另一方面瀏覽器供應商可以在不破壞相容性的情況下提高CSS和XPath的效能。
* 如果你想要利用新的 API例如 `document.getElementsByClassName("selected")` 甚至 `document.evaluate()`)來提高效能,則必須重寫程式碼。另一方面,瀏覽器供應商可以在不破壞相容性的情況下提高 CSS XPath 的效能。
在 Web 瀏覽器中,使用宣告式 CSS 樣式比使用 JavaScript 命令式地操作樣式要好得多。類似地,在資料庫中,使用像 SQL 這樣的宣告式查詢語言比使用命令式查詢 API 要好得多 [^vi]。
@ -504,7 +504,7 @@ db.observations.aggregate([
]);
```
聚合管道語言與SQL的子集具有類似表現力但是它使用基於JSON的語法而不是SQL的英語句子式語法; 這種差異也許是口味問題。這個故事的寓意是NoSQL系統可能會發現自己意外地重新發明了SQL儘管帶著偽裝。
聚合管道語言與 SQL 的子集具有類似表現力,但是它使用基於 JSON 的語法而不是 SQL 的英語句子式語法;這種差異也許是口味問題。這個故事的寓意是 NoSQL 系統可能會發現自己意外地重新發明了 SQL儘管帶著偽裝。
## 圖資料模型

View File

@ -5,7 +5,7 @@
* **非同步asynchronous**
不等待某些事情完成(例如,將資料傳送到網路中的另一個節點),並且不會假設要花多長時間。請參閱[同步複製與非同步複製](ch5.md#同步複製與非同步複製)”“[同步網路與非同步網路](ch8.md#同步網路與非同步網路)”以及“[系統模型與現實](ch8.md#系統模型與現實)”。
不等待某些事情完成(例如,將資料傳送到網路中的另一個節點),並且不會假設要花多長時間。請參閱[同步複製與非同步複製](ch5.md#同步複製與非同步複製)”“[同步網路與非同步網路](ch8.md#同步網路與非同步網路)”以及“[系統模型與現實](ch8.md#系統模型與現實)”。
* **原子atomic**