搜尋
首頁web前端css教學如何使GraphQl和DynamoDB一起效果很好

如何使GraphQl和DynamoDB一起效果很好

無服務器體系結構,GraphQL API和DynamoDB數據庫形成了網站開發的強大組合。雖然無服務器和GraphQl廣泛流行,但DynamoDB通常被誤解或避免,有時被錯誤地被視為在大規模尺度上僅有益。

最初,我分享了這種誤解,更喜歡我的無服務器項目的SQL數據庫。但是,在獲得DynamoDB的經驗之後,我發現了各種項目規模的優勢。為了說明,讓我們從頭開始構建樣本API,繞過複雜的ORMS或GraphQl框架以揭示基礎機制。這種動手方法可能會改變您對DynamoDB價值的看法。

解決共同的問題

DynamoDB採用的主要障礙是其陡峭的學習曲線,儘管其功能很少有爭議。儘管學習曲線很重要,但SQL數據庫並不是無服務器應用程序的理想選擇。在無服務器環境中部署和管理SQL數據庫連接的挑戰是重大的。 DynamoDB本質上是無服務器友好的,可以通過減輕未來擴展的複雜性來提供長期優勢。最初對學習DynamoDB的投資最終可以節省大量的未來頭痛。

配對GraphQL與DynamoDB的適合性更為複雜。現有的GraphQL文檔,教程和示例中的大部分都假設了關係數據庫。即使是DynamoDB專家,也是“ DynamoDB書”的作者Alex Debrie,也建議您使用這種組合,這主要是由於將GraphQL解析器作為順序的,獨立的數據庫調用的常見實踐,導致過多的讀取。

另一個潛在的問題是DynamoDB偏愛預定義的訪問模式。 GraphQl的強度在於它比休息更容易處理任意查詢的能力。對於用戶可以製作不可預測的查詢的公共API,這變得更加問題。但是,GraphQL經常用於私有API,其中對客戶端和服務器的控制允許管理和控制查詢模式。如果沒有仔細的設計,GraphQl查詢就可以輕鬆地超載任何數據庫。

一個簡單的數據模型

此示例API將與團隊,用戶和認證的組織建模。這些關係在下面的實體關係圖中描述。每個團隊都有多個用戶,每個用戶都可以擁有多個認證。

關係數據庫表示

儘管我們的目標是DynamoDB模型,但SQL數據庫表示形式將類似於以下圖:(圖將在這裡,顯示表格和關係)

為了處理用戶與認證之間的多對多關係,引入了一個名為“憑據”的中介表。到期日期是此表中的唯一屬性。為簡單起見,省略了其他屬性。

訪問模式

有效的DynamoDB數據建模取決於了解訪問模式。關係數據庫以標準化數據開頭,並使用加入進行數據檢索。 DynamoDB缺乏連接;因此,數據模型必須與預期的訪問方法一致。這是一個迭代過程。優先考慮頻繁的訪問模式。許多人將直接映射到GraphQl查詢,而其他則可以內部用於身份驗證或授權。頻繁的操作(例如,每周行政檢查)不需要優化的設計;效率低下的方法(如表掃描)就足夠了。

高頻訪問:

  • 用戶通過ID或名稱
  • 由ID或名稱的團隊
  • 用ID或名稱認證

頻繁訪問:

  • 團隊中的所有用戶(按團隊ID)
  • 用戶的所有認證
  • 所有團隊
  • 所有認證

不經常訪問:

  • 團隊中用戶的所有認證
  • 所有擁有特定認證的用戶
  • 所有團隊中獲得認證的用戶

DynamoDB單台設計

DynamoDB缺乏連接需要根據主要鍵或預定義索引進行查詢。數據庫不強制執行模式,允許單個表中的各種項目類型。最好的做法是將所有項目存儲在單個表中,以有效地共同確定的數據訪問。下面的模式反映了這種方法,與前面確定的訪問模式保持一致。 (架構詳細信息將在這裡,顯示主鍵,排序鍵和索引)

主要鍵是分區密鑰(PK)和Sort Key(SK)的複合材料。檢索項目需要指定分區密鑰以及單一鍵值或範圍。索引(GSI1PK,GSI1SK等)用於靈活訪問不同項目類型。 “#”符號充當了空鍵的佔位符。

數據庫架構實現(代碼段)

數據庫模式在應用程序中執行。 DynamoDB的API功能強大,但複雜。許多開發人員使用ORM來簡化。在這裡,我們將使用助手功能直接訪問數據庫來定義團隊項目架構。 (db_map的代碼段,包括團隊的get,put和解析功能,將在這裡)

要添加一個新團隊,您會致電: DB_MAP.TEAM.put({teamId:"t_01",teamName:"North Team"})

這將生成數據庫API的索引和鍵值。 parse方法將數據庫項轉換回應用程序模型。

GraphQL模式(代碼段)

(類型團隊,用戶,認證,憑據和查詢的類型類型定義定義將在這裡。)

將GraphQL和DynamoDB與解析器連接

解析器執行GraphQl查詢。解析器對於構建我們的API至關重要。 GraphQL模式中的每個查詢都有一個相應的根解析器(此處僅顯示團隊解析器)。這些解析器返回承諾或包含部分查詢結果的對象。

如果查詢返回Team類型,則執行將繼續使用Team類型解析器。該解析器具有每個Team屬性的功能。如果丟失了解析器(例如,對於id ),則檢查根解析器是否提供了值。

查詢採用四個參數: root (parent對象), args (查詢參數), context (應用程序數據,包括數據庫參考)和info (查詢詳細信息,在此處未使用)。

下面的解析器使用ctx.db.singletable可訪問DynamoDB表。 getquery方法直接與數據庫進行交互,並且DB_MAP.TEAM...使用輔助函數轉換架構。 parse方法將數據轉換為GraphQL架構格式。 (ResolverMap的代碼段,包括用於查詢的解析器,QUERY.TEAMBYNAME,QUERY.ALLTEAMS,team.name,team.Members.Members,user.name,user.credentials將在這裡)

讓我們跟踪以下查詢的執行:團隊根解析器按ID讀取團隊,返回ID和名稱。 Team類型解析器然後檢索所有團隊成員。 User類型解析器為每個用戶獲取憑據和認證。每個成員和五個憑證都有七個數據庫讀取。儘管與SQL數據庫(可能是四個呼叫)相比,這似乎看起來過高,但根據各種因素,七個DynamoDB讀取可能更快,更便宜。

查詢{team(ID:“ T_01”){
  ID
  姓名
  成員{
    ID
    姓名
    證書{
      ID
      認證{
        ID
        姓名
      }
    }
  }
}}}

過度提取和n 1問題

優化GraphQL API涉及許多權衡。在DynamoDB和SQL之間進行選擇時,有兩個關鍵的考慮因素是過度提取的,而N 1問題。這些通常是對立的力量。當解析器要求更多的數據時,就會發生過度提取。當根部或類型的解析器(例如, Team解析器中的members )試圖在單個數據庫調用中檢索過多的數據時,就會發生這種情況。如果查詢沒有請求name屬性,請檢索它是浪費的。

N 1問題恰恰相反。將所有讀取到最低級別的解析器都意味著更高級別的數據庫請求。代替了一個五個成員的電話,而是進行了五個單獨的讀數。這可能會導致更多讀取。實際上,諸如DataLoader批處理這些請求之類的工具減少了數據庫調用的數量。這些較小的原子要求對於有效的批處理至關重要。

對於SQL,通常最好的帶有數據加載器的小型低水平解析器是最好的。對於DynamoDB,與單台設計對齊的“更智能”的高級解析器更有效。在這種情況下,過度取得的邪惡通常是較小的邪惡。

部署(摘要)

可以使用Architect快速部署此示例,這是用於在AWS上構建無服務器應用程序的開源工具。 GitHub存儲庫提供代碼。克隆和運行npm install後,可以在本地啟動應用程序(包括本地數據庫)。在AWS(包括DynamoDB)上的生產部署也很簡單。

以上是如何使GraphQl和DynamoDB一起效果很好的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
Draggin'和droppin'在反應中Draggin'和droppin'在反應中Apr 17, 2025 am 11:52 AM

React生態系統為我們提供了許多庫,所有庫都集中在拖放的相互作用上。我們有反應,反應,可愛dnd,

快速軟件快速軟件Apr 17, 2025 am 11:49 AM

最近有一些關於快速軟件的完美互連的事情。

帶有背景折疊的嵌套梯度帶有背景折疊的嵌套梯度Apr 17, 2025 am 11:47 AM

我可以說我經常使用背景折疊。 IT Wager IT幾乎從未在日常CSS工作中使用。但是在斯特凡·朱迪斯(Stefan Judis)的帖子中,我想起了它,

使用React Hooks使用requestAnimationFrame使用React Hooks使用requestAnimationFrameApr 17, 2025 am 11:46 AM

使用RequestAnimationFrame進行動畫化應該很容易,但是如果您還沒有徹底閱讀React的文檔,那麼您可能會遇到一些事情

需要滾動到頁面頂部嗎?需要滾動到頁面頂部嗎?Apr 17, 2025 am 11:45 AM

向用戶提供此鏈接的最簡單方法是針對元素上的ID的鏈接。如此...

最好的(GraphQl)API是您編寫的API最好的(GraphQl)API是您編寫的APIApr 17, 2025 am 11:36 AM

聽著,我不是GraphQL專家,但我確實喜歡與之合作。作為前端開發人員,它向我曝光數據的方式非常酷。它就像一個菜單

在保留邊框半徑的同時,擴展盒子的各種方法在保留邊框半徑的同時,擴展盒子的各種方法Apr 17, 2025 am 11:19 AM

我最近注意到Codepen的一個有趣的更改:在懸停在主頁上的筆時,有一個矩形,圓角在後面擴展。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
1 個月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
1 個月前By尊渡假赌尊渡假赌尊渡假赌

熱工具

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具