@@ -17,7 +17,7 @@ breadcrumbs: false
17171 . 作為應用程式開發者,你觀察現實世界(其中有人員、組織、貨物、行為、資金流動、感測器等),並用物件或資料結構,以及操作這些資料結構的 API 來建模。這些結構通常是特定於應用程式的。
18182 . 當你想要儲存這些資料結構時,你用通用的資料模型來表達它們,例如 JSON 或 XML 文件、關係資料庫中的表,或者圖中的頂點和邊。這些資料模型是本章的主題。
19193 . 構建你的資料庫軟體的工程師決定了如何用記憶體、磁碟或網路上的位元組來表示文件/關係/圖資料。這種表示可能允許以各種方式查詢、搜尋、操作和處理資料。我們將在 [ 第 4 章] ( /tw/ch4#ch_storage ) 中討論這些儲存引擎的設計。
20- 4 . 在更低的層次上,硬體工程師已經想出瞭如何用電流 、光脈衝、磁場等來表示位元組的方法。
20+ 4 . 在更低的層次上,硬體工程師已經想出了如何用電流 、光脈衝、磁場等來表示位元組的方法。
2121
2222在複雜的應用程式中可能有更多的中間層,例如基於 API 之上的 API,但基本思想仍然相同:每一層透過提供一個簡潔的資料模型來隱藏下層的複雜性。這些抽象允許不同的人群 —— 例如,資料庫供應商的工程師和使用他們資料庫的應用程式開發者 —— 有效地合作。
2323
@@ -499,7 +499,7 @@ CREATE
499499
500500當 [ 圖 3-6] ( /tw/ch3#fig_datamodels_graph ) 的所有頂點和邊都新增到資料庫後,我們可以開始提出有趣的問題:例如,* 查詢所有從美國移民到歐洲的人的姓名* 。也就是說,找到所有具有指向美國境內位置的 ` BORN_IN ` 邊,以及指向歐洲境內位置的 ` LIVING_IN ` 邊的頂點,並返回每個頂點的 ` name ` 屬性。
501501
502- [ 示例 3-5] ( /tw/ch3#fig_cypher_query ) 顯示瞭如何在 Cypher 中表達該查詢。相同的箭頭符號用於 ` MATCH ` 子句中以在圖中查詢模式:` (person) -[:BORN_IN]-> () ` 匹配由標記為 ` BORN_IN ` 的邊相關的任意兩個頂點。該邊的尾頂點繫結到變數 ` person ` ,頭頂點未命名。
502+ [ 示例 3-5] ( /tw/ch3#fig_cypher_query ) 顯示了如何在 Cypher 中表達該查詢。相同的箭頭符號用於 ` MATCH ` 子句中以在圖中查詢模式:` (person) -[:BORN_IN]-> () ` 匹配由標記為 ` BORN_IN ` 的邊相關的任意兩個頂點。該邊的尾頂點繫結到變數 ` person ` ,頭頂點未命名。
503503
504504{{< figure id="fig_cypher_query" title="示例 3-5. Cypher 查詢查詢從美國移民到歐洲的人" class="w-full my-4" >}}
505505
@@ -741,7 +741,7 @@ Datalog 實際上基於關係資料模型,而不是圖,但它出現在本書
741741
742742Datalog 資料庫的內容由 * 事實* 組成,每個事實對應於關係表中的一行。例如,假設我們有一個包含位置的表 * location* ,它有三列:* ID* 、* name* 和 * type* 。美國是一個國家的事實可以寫成 ` location(2, "United States", "country") ` ,其中 ` 2 ` 是美國的 ID。一般來說,語句 ` table(val1, val2, …) ` 意味著 ` table ` 包含一行,其中第一列包含 ` val1 ` ,第二列包含 ` val2 ` ,依此類推。
743743
744- [ 示例 3-11] ( /tw/ch3#fig_datalog_triples ) 顯示瞭如何在 Datalog 中編寫 [ 圖 3-6] ( /tw/ch3#fig_datamodels_graph ) 左側的資料。圖的邊(` within ` 、` born_in ` 和 ` lives_in ` )表示為兩列連線表。例如,Lucy 的 ID 是 100,愛達荷州的 ID 是 3,所以關係"Lucy 出生在愛達荷州"表示為 ` born_in(100, 3) ` 。
744+ [ 示例 3-11] ( /tw/ch3#fig_datalog_triples ) 顯示了如何在 Datalog 中編寫 [ 圖 3-6] ( /tw/ch3#fig_datamodels_graph ) 左側的資料。圖的邊(` within ` 、` born_in ` 和 ` lives_in ` )表示為兩列連線表。例如,Lucy 的 ID 是 100,愛達荷州的 ID 是 3,所以關係"Lucy 出生在愛達荷州"表示為 ` born_in(100, 3) ` 。
745745
746746{{< figure id="fig_datalog_triples" title="示例 3-11. [ 圖 3-6] ( /tw/ch3#fig_datamodels_graph ) 中資料的子集,表示為 Datalog 事實" class="w-full my-4" >}}
747747
@@ -805,7 +805,7 @@ GraphQL 是一種查詢語言,從設計上講,它比我們在本章中看到
805805
806806GraphQL 的靈活性是有代價的。採用 GraphQL 的組織通常需要工具將 GraphQL 查詢轉換為對內部服務的請求,這些服務通常使用 REST 或 gRPC(參見 [ 第 5 章] ( /tw/ch5#ch_encoding ) )。授權、速率限制和效能挑戰是額外的關注點 [ ^ 61 ] 。GraphQL 的查詢語言也受到限制,因為 GraphQL 來自不受信任的來源。該語言不允許任何可能執行成本高昂的操作,否則使用者可能透過執行大量昂貴的查詢對伺服器執行拒絕服務攻擊。特別是,GraphQL 不允許遞迴查詢(與 Cypher、SPARQL、SQL 或 Datalog 不同),並且不允許任意搜尋條件,如"查詢在美國出生並現在居住在歐洲的人"(除非服務所有者特別選擇提供此類搜尋功能)。
807807
808- 儘管如此,GraphQL 還是很有用的。[ 示例 3-13] ( /tw/ch3#fig_graphql_query ) 顯示瞭如何使用 GraphQL 實現 Discord 或 Slack 等群聊應用程式。查詢請求使用者有權訪問的所有頻道,包括頻道名稱和每個頻道中的 50 條最新訊息。對於每條訊息,它請求時間戳、訊息內容以及訊息傳送者的姓名和個人資料圖片 URL。此外,如果訊息是對另一條訊息的回覆,查詢還會請求傳送者姓名和它所回覆的訊息內容(可能以較小的字型呈現在回覆上方,以提供一些上下文)。
808+ 儘管如此,GraphQL 還是很有用的。[ 示例 3-13] ( /tw/ch3#fig_graphql_query ) 顯示了如何使用 GraphQL 實現 Discord 或 Slack 等群聊應用程式。查詢請求使用者有權訪問的所有頻道,包括頻道名稱和每個頻道中的 50 條最新訊息。對於每條訊息,它請求時間戳、訊息內容以及訊息傳送者的姓名和個人資料圖片 URL。此外,如果訊息是對另一條訊息的回覆,查詢還會請求傳送者姓名和它所回覆的訊息內容(可能以較小的字型呈現在回覆上方,以提供一些上下文)。
809809
810810{{< figure id="fig_graphql_query" title="示例 3-13. 群聊應用程式的示例 GraphQL 查詢" class="w-full my-4" >}}
811811
0 commit comments