mirror of
https://github.com/Vonng/ddia.git
synced 2024-10-07 15:10:07 +08:00
update text spacing with pandu and some manual adjustments
This commit is contained in:
parent
c7343c4325
commit
bf82fb3209
@ -36,7 +36,7 @@
|
||||
|
||||
> 计算是一种流行文化,流行文化鄙视历史。 流行文化关乎个体身份和参与感,但与合作无关。流行文化活在当下,也与过去和未来无关。 我认为大部分(为了钱)编写代码的人就是这样的, 他们不知道自己的文化来自哪里。
|
||||
>
|
||||
> ——阿兰·凯接受Dobb博士的杂志采访时(2012年)
|
||||
> —— 阿兰・凯接受 Dobb 博士的杂志采访时(2012 年)
|
||||
|
||||
|
||||
## 目录
|
||||
|
17
ch2.md
17
ch2.md
@ -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 模型(SQL:1999 之前)中,最常见的规范化表示形式是将职位,教育和联系信息放在单独的表中,对 User 表提供外键引用,如 [图 2-1](img/fig2-1.png) 所示。
|
||||
* 后续的SQL标准增加了对结构化数据类型和XML数据的支持;这允许将多值数据存储在单行内,并支持在这些文档内查询和索引。这些功能在Oracle,IBM DB2,MS SQL Server和PostgreSQL中都有不同程度的支持【6,7】。JSON数据类型也得到多个数据库的支持,包括IBM DB2,MySQL和PostgreSQL 【8】。
|
||||
* 后续的 SQL 标准增加了对结构化数据类型和 XML 数据的支持;这允许将多值数据存储在单行内,并支持在这些文档内查询和索引。这些功能在 Oracle,IBM DB2,MS SQL Server 和 PostgreSQL 中都有不同程度的支持【6,7】。JSON 数据类型也得到多个数据库的支持,包括 IBM DB2,MySQL 和 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) |
|
||||
|
||||
|
@ -5,7 +5,7 @@
|
||||
|
||||
* **异步(asynchronous)**
|
||||
|
||||
不等待某些事情完成(例如,将数据发送到网络中的另一个节点),并且不会假设要花多长时间。请参阅[同步复制与异步复制](ch5.md#同步复制与异步复制)”,“[同步网络与异步网络](ch8.md#同步网络与异步网络)”,以及“[系统模型与现实](ch8.md#系统模型与现实)”。
|
||||
不等待某些事情完成(例如,将数据发送到网络中的另一个节点),并且不会假设要花多长时间。请参阅“[同步复制与异步复制](ch5.md#同步复制与异步复制)”、“[同步网络与异步网络](ch8.md#同步网络与异步网络)”以及“[系统模型与现实](ch8.md#系统模型与现实)”。
|
||||
|
||||
* **原子(atomic)**
|
||||
|
||||
|
@ -36,7 +36,7 @@
|
||||
|
||||
> 計算是一種流行文化,流行文化鄙視歷史。 流行文化關乎個體身份和參與感,但與合作無關。流行文化活在當下,也與過去和未來無關。 我認為大部分(為了錢)編寫程式碼的人就是這樣的, 他們不知道自己的文化來自哪裡。
|
||||
>
|
||||
> ——阿蘭·凱接受Dobb博士的雜誌採訪時(2012年)
|
||||
> —— 阿蘭・凱接受 Dobb 博士的雜誌採訪時(2012 年)
|
||||
|
||||
|
||||
## 目錄
|
||||
|
16
zh-tw/ch2.md
16
zh-tw/ch2.md
@ -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 模型(SQL:1999 之前)中,最常見的規範化表示形式是將職位,教育和聯絡資訊放在單獨的表中,對 User 表提供外來鍵引用,如 [圖 2-1](../img/fig2-1.png) 所示。
|
||||
* 後續的SQL標準增加了對結構化資料型別和XML資料的支援;這允許將多值資料儲存在單行內,並支援在這些文件內查詢和索引。這些功能在Oracle,IBM DB2,MS SQL Server和PostgreSQL中都有不同程度的支援【6,7】。JSON資料型別也得到多個數據庫的支援,包括IBM DB2,MySQL和PostgreSQL 【8】。
|
||||
* 後續的 SQL 標準增加了對結構化資料型別和 XML 資料的支援;這允許將多值資料儲存在單行內,並支援在這些文件內查詢和索引。這些功能在 Oracle,IBM DB2,MS SQL Server 和 PostgreSQL 中都有不同程度的支援【6,7】。JSON 資料型別也得到多個數據庫的支援,包括 IBM DB2,MySQL 和 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,儘管帶著偽裝。
|
||||
|
||||
|
||||
## 圖資料模型
|
||||
|
@ -5,7 +5,7 @@
|
||||
|
||||
* **非同步(asynchronous)**
|
||||
|
||||
不等待某些事情完成(例如,將資料傳送到網路中的另一個節點),並且不會假設要花多長時間。請參閱[同步複製與非同步複製](ch5.md#同步複製與非同步複製)”,“[同步網路與非同步網路](ch8.md#同步網路與非同步網路)”,以及“[系統模型與現實](ch8.md#系統模型與現實)”。
|
||||
不等待某些事情完成(例如,將資料傳送到網路中的另一個節點),並且不會假設要花多長時間。請參閱“[同步複製與非同步複製](ch5.md#同步複製與非同步複製)”、“[同步網路與非同步網路](ch8.md#同步網路與非同步網路)”以及“[系統模型與現實](ch8.md#系統模型與現實)”。
|
||||
|
||||
* **原子(atomic)**
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user