DynamoDB นิพจน์และ Go

เมื่อเร็ว ๆ นี้ฉันยังคงรักษารหัส Go ที่จัดการการทำงานต่างๆของ DynamoDB โค้ดนี้เต็มไปด้วยแมปExpressionAttributeValuesและExpressionAttributeNames ที่กำหนดด้วยตนเอง มันดูยุ่งยาก หลังจากการค้นคว้าอย่างรวดเร็วฉันพบว่า AWS SDK for Go มีคุณสมบัติที่ช่วยให้สามารถเขียนโค้ดที่สะอาดยิ่งขึ้นได้

ในบทความนี้ฉันต้องการแบ่งปันวิธีการทำงานกับ DynamoDB โดยใช้ AWS SDK for Go ข้อมูลโค้ดที่ให้ไว้ด้านล่างนี้เป็นส่วนหนึ่งของโครงการตัวอย่างที่ฉันสร้างขึ้นเพื่อเสริมบทความ

DynamoDB - การเปลี่ยนจากโมเดลข้อมูลเชิงสัมพันธ์เป็นแนวคิดการออกแบบตารางเดียว

ก่อนที่จะข้ามไปที่ Go code ฉันอยากจะพูดถึงการออกแบบตาราง DynamoDB ในฐานะนักพัฒนาที่มีประสบการณ์ในการออกแบบฐานข้อมูลเชิงสัมพันธ์ฉันมีความเข้าใจผิดเกี่ยวกับการสร้างแบบจำลองข้อมูลสำหรับ DynamoDB ฉันใช้หลักการเดียวกันของการทำให้เป็นมาตรฐานเดียวกันเมื่อวางแผนโมเดลสำหรับ DynamoDB เป็นผลให้ผมมีตารางปกติหลายโดยการสนับสนุนของการเข้าร่วม

DynamoDB มอบประสิทธิภาพระดับมิลลิวินาทีหลักเดียวในทุกขนาด แต่ในการดึงข้อมูลจำเป็นต้องมีการร้องขอเครือข่าย โดยปกติเครือข่าย I / O เป็นปัญหาคอขวดด้านการแสดงของแอปพลิเคชัน การมีคำขอหลายรายการไปยังฐานข้อมูลแบบน้ำตกจะทำให้ประสิทธิภาพลดลงเท่านั้น ในการใช้ศักยภาพ DynamoDB อย่างเต็มที่โดยลดจำนวนคำขอไปยังฐานข้อมูลที่ต้องการโดยควรเป็นคำขอเดียว หมายความว่าแอปพลิเคชัน DynamoDB ควรทำงานกับตารางให้น้อยที่สุด จึงมีการสร้างแนวคิดการออกแบบตารางเดียว

แนวคิดคือการแบนข้อมูลแอปพลิเคชัน บางครั้งรายการข้อมูลจะมาพร้อมกับรายการข้อมูลเมตา สำหรับฉันการเปลี่ยนไปใช้การออกแบบตารางเดียวเป็นเรื่องที่ท้าทายส่วนหนึ่งเป็นเพราะความสับสนในคำศัพท์ ในส่วนประกอบหลักของ DynamoDB: ตารางรายการและแอตทริบิวต์ แต่ตาราง DynamoDB ไม่เท่ากับตารางฐานข้อมูลเชิงสัมพันธ์ เป็นมุมมองในฐานข้อมูลเชิงสัมพันธ์ที่หลายตารางรวมเข้าด้วยกัน

รูปที่ 1. การแม็ปโครงสร้างเชิงสัมพันธ์และ DynamoDB

ในความคิดของฉันคำศัพท์ MongoDB ดีกว่า ในฐานะที่เป็นเอกสารกล่าวว่า MongoDB เก็บระเบียนข้อมูลเป็นเอกสารที่มีการรวมตัวกันในคอลเลกชัน ฐานข้อมูลจัดเก็บคอลเลกชันเอกสารอย่างน้อยหนึ่งชุด การใช้เอกสารคำและคอลเลกชันจะลบความสัมพันธ์ทางปัญญากับตารางในฐานข้อมูลเชิงสัมพันธ์

คีย์ตาราง DynamoDB

เป็นการยากที่จะจินตนาการถึงสถาปัตยกรรมฐานข้อมูลที่มีประสิทธิภาพโดยไม่มีคีย์และดัชนี นี่ฉันต้องการที่จะมุ่งเน้นเฉพาะในระดับประถมศึกษา , พาร์ทิชันและการจัดเรียงปุ่ม - ชุดต่ำสุดของส่วนประกอบที่จำเป็นในการสร้างตารางและดำเนินการการดำเนินงาน DynamoDB

คีย์หลักจะต้องระบุเมื่อมีการสร้างตาราง คีย์หลักจะระบุแต่ละรายการในตารางโดยไม่ซ้ำกัน คีย์หลักคือทั้งพาร์ทิชันที่สำคัญหรือการรวมกันของพาร์ทิชัน และ การจัดเรียงที่สำคัญ

DynamoDB ใช้ค่าของคีย์พาร์ติชันเป็นข้อมูลป้อนเข้าของฟังก์ชันแฮชภายใน เอาต์พุตของฟังก์ชันแฮชจะกำหนดพาร์ติชันที่เก็บเร็กคอร์ดไว้ รายการที่มีคีย์พาร์ติชันเดียวกันอยู่ด้วยกัน

สิ่งสำคัญที่ต้องรู้และเข้าใจ:

  • ประเภทของคีย์หลักที่กำหนดไว้ในตาราง
  • คีย์พาร์ติชันคืออะไร
  • คีย์การจัดเรียงคืออะไร

DynamoDB API - วิธีการเข้าถึงข้อมูล

อ่านวิธีการ

  • BatchGetItem - ดึงข้อมูลได้มากถึง 100 รายการจากตารางอย่างน้อยหนึ่งตาราง
  • GetItem - ดึงข้อมูลรายการเดียวจากตารางด้วยคีย์หลักที่กำหนด
  • Query - ดึงข้อมูลไอเท็มทั้งหมดที่มีพาร์ติชันคีย์เฉพาะ
  • Scan - ดึงรายการทั้งหมดในตารางหรือดัชนีที่ระบุ
  • TransactGetItems - ดึงข้อมูลหลายรายการจากตารางอย่างน้อยหนึ่งตาราง

เขียนวิธีการ

  • BatchWriteItem - ใส่หรือลบหลายรายการในตารางอย่างน้อยหนึ่งตาราง
  • DeleteItem - ลบระเบียนเดียวในตารางโดยใช้คีย์หลัก
  • PutItem -สร้างหรือแทนที่รายการเก่าด้วยรายการใหม่
  • TransactWriteItems - การดำเนินการเขียนแบบซิงโครนัสบนรายการจากตารางอย่างน้อยหนึ่งตาราง (ไม่มีการดำเนินการสองรายการที่สามารถกำหนดเป้าหมายระเบียนเดียวกันได้)
  • UpdateItem - แก้ไขแอตทริบิวต์ของรายการที่มีอยู่หรือเพิ่มรายการใหม่ในตารางหากยังไม่มีอยู่

ไม่มีความแตกต่างเมื่อไม่มีรายการ ทั้งสองวิธีสร้างรายการใหม่ เมื่อพบรายการที่มีอยู่Putจะแทนที่ด้วยรายการใหม่อัปเดตจะเปลี่ยนแปลงแอตทริบิวต์ของรายการ

จาก DynamoDB API เป็น SDK

DynamoDB เป็นหนึ่งในบริการต่างๆที่ AWS ให้บริการ ทุกบริการมี API ซึ่งเป็นชุดวิธีการเรียกใช้บริการซึ่งเปิดเผยกับไคลเอ็นต์ผ่านจุดสิ้นสุด HTTP แล้ว AWS SDK คืออะไร? เป็นชุดประเภทและฟังก์ชันในการสร้างและเรียกใช้คำขอ HTTP ไปยังบริการของ AWS

รูปที่ 2. การใช้ AWS SDK ในแอปพลิเคชัน

AWS SDK มีให้บริการในภาษาการเขียนโปรแกรมหลายภาษา ฟังก์ชันการทำงานที่กำหนดโดย API บริการของ AWS

แพ็คเกจนิพจน์

Go AWS SDK มีวิธีการอ่านและเขียนข้อมูลใน DynamoDB โครงสร้างที่อธิบายอินพุตเมธอดประกอบด้วยตัวกรองแมปแอตทริบิวต์เงื่อนไขและนิพจน์ (แมปชื่อและค่า) ต่อไปนี้เป็นตัวอย่างของการสร้างที่QueryInput

รหัสนี้ใช้งานได้ แต่มีข้อบกพร่อง การสร้างExpressionAttributeValuesสำหรับKeyConditionExpressionด้วยตนเองเป็นกระบวนการที่ใช้แรงงานมากและเกิดข้อผิดพลาดได้ง่าย นอกจากนี้ยังมีข้อมูลเกี่ยวกับการดำเนินการภายในของการประมวลผลแบบสอบถาม

แสดงออกแพคเกจให้บริการประเภทและฟังก์ชั่นในการสร้างสายการแสดงออก (ฟิลเตอร์เพื่ออธิบายและเงื่อนไข) และแอตทริบิวต์แผนที่ รหัสต่อไปนี้ใช้วิธีการประกาศในการสร้างQueryInputโดยไม่ต้องเปิดเผยรายละเอียดการใช้งาน

องค์ประกอบหลักของแพคเกจเป็นผู้สร้าง มีวิธีการสร้างโครงสร้างนิพจน์ วิธีทะเยอทะยานของโครงสร้างที่กลับมาจัดรูปแบบ DynamoDB สำนวนExpressionAttributeNamesและExpressionAttributeValuesแผนที่

Builderใช้การใช้งานคอนกรีตสี่แบบ:

  • ConditionBuilder - สร้างFilterExpressionและConditionExpression
  • KeyConditionBuilder - สร้างKeyConditionExpression
  • ProjectionBuilder - สร้างProjectionExpression
  • UpdateBuilder - สร้างUpdateExpression

FilterExpressionรองรับฟังก์ชั่นเดียวกันและรูปแบบเป็นConditionExpression ดังนั้นConditionBuilderจึงแสดงทั้งสองประเภทของ
นิพจน์ เป็นผลให้WithConditionและWithFilterทั้งยอมรับตัวอย่างของConditionBuilder

การใช้นิพจน์และตัวสร้าง

ตารางต่อไปนี้แสดงนิพจน์และตัวสร้างที่ใช้ในการดำเนินการ DynamoDB ที่แตกต่างกัน

ตารางที่ 1. การใช้นิพจน์และตัวสร้างในการดำเนินการ DynamoDB

BatchGetItemต้องการแผนที่ RequestItems โดยที่คีย์คือชื่อตารางและค่าคือนิยามไอเท็มที่จะได้รับจากตาราง นิพจน์และตัวสร้างที่ให้ไว้ในตารางที่ใช้ในการกำหนดรายการ

TransactGetItemsยอมรับรายการรับไอเทม รับแต่ละรายการที่อธิบายโดยใช้นิพจน์และตัวสร้างที่เกี่ยวข้อง

TransactWriteItemsยอมรับรายการของรายการแต่ละประเภท ConditionCheck, Delete, Put และ Update

PutItem และ Put ต้องการอินสแตนซ์ของโครงสร้างรายการที่ต้องมีคีย์หลักอย่างน้อย นิพจน์เงื่อนไขเป็นทางเลือกสำหรับการดำเนินการใส่

อย่างที่คุณเห็นแพ็กเกจนิพจน์ตรงตามข้อกำหนดส่วนใหญ่เพื่อเตรียมอินพุตสำหรับการดำเนินการ DynamoDB แต่มีคุณลักษณะที่ขาดหายไปนั่นคือนิพจน์สำหรับคีย์หลัก เมื่อกำหนดอินพุตการดำเนินการที่ต้องใช้คีย์หลักคีย์จะสร้างขึ้นด้วยตนเอง (เกิดขึ้นจริงในขณะที่เขียน) ต่อไปนี้เป็นรายการของการดำเนินการที่ต้องใช้คีย์หลัก:

  • GetItem
  • DeleteItem
  • UpdateItem
  • BatchGetItem , BatchWriteItem , TransactGetItems , TransactWriteItems - ทุกรายการที่ร้องขอต้องกำหนดคีย์หลัก

สำหรับบทความนี้ฉันสร้างตาราง DynamoDB ที่เก็บข้อมูลใบแจ้งหนี้ ทุกใบแจ้งหนี้ประกอบด้วยส่วนหัวหนึ่งรายการและรายการโฆษณาตั้งแต่ศูนย์ถึงหลายรายการ ฉันใช้พาร์ติชันคีย์เดียวสำหรับเอกสารทั้งหมดที่เกี่ยวข้องกับใบแจ้งหนี้เดียวกัน รับประกันว่าข้อมูลใบแจ้งหนี้ที่เก็บไว้ในตำแหน่งทางกายภาพเดียวบนเซิร์ฟเวอร์ในศูนย์ข้อมูล ซึ่งจะช่วยลดเวลาในการตอบสนองของการดำเนินการ ฉันใช้คีย์การจัดเรียงเพื่อแยกความแตกต่างระหว่างส่วนหัวของใบแจ้งหนี้และรายการโฆษณา

สร้างบันทึก

ตัวอย่างข้อมูลด้านบนประกอบด้วยส่วนต่างๆดังต่อไปนี้:

  • แปลงโครงสร้างรายการใบแจ้งหนี้เป็นแมปแอตทริบิวต์ DynamoDB (L3)
  • กำหนดPutItemInput (L8)
  • ดำเนินการใส่รายการ (L13)

PutItemเหมาะเมื่อคุณต้องการเขียนเพียงรายการเดียว แต่ในบางกรณีจำเป็นต้องมีการเขียนบันทึกหลายรายการในธุรกรรมเดียว ตัวอย่างเช่นควรจัดเก็บใบแจ้งหนี้และรายการทั้งหมดไว้ในธุรกรรมเดียว

ตัวอย่างข้อมูลด้านบนประกอบด้วยส่วนต่างๆดังต่อไปนี้:

  • แปลงโครงสร้างใบแจ้งหนี้เป็นแมปแอตทริบิวต์ DynamoDB (L3)
  • เริ่มต้นรายการธุรกรรมและเพิ่มใบแจ้งหนี้เข้าไป (L8–9)
  • แปลงโครงสร้างรายการใบแจ้งหนี้เป็นแมปแอตทริบิวต์ DynamoDB (L15)
  • เพิ่มรายการในส่วนรายการธุรกรรม (L20)
  • กำหนดและตรวจสอบการป้อนข้อมูลธุรกรรม (L26–27)
  • ดำเนินการธุรกรรม (L31)

ตัวอย่างข้อมูลด้านบนประกอบด้วยส่วนต่างๆดังต่อไปนี้:

  • สร้างคีย์หลักของรายการ (L5–9)
  • กำหนดนิพจน์สำหรับการอัปเดต (L14–17)
  • ใช้นิพจน์เพื่อสร้างUpdateItemInput (L22)
  • ดำเนินการอัปเดตรายการ (L30)

ตัวอย่างข้อมูลด้านบนประกอบด้วยส่วนต่างๆดังต่อไปนี้:

  • กำหนดนิพจน์สำหรับการอัปเดต (L9–12)
  • เริ่มชิ้นส่วนรายการธุรกรรม (L17)
  • สร้างคีย์หลักของรายการ (L19–23)
  • ใช้นิพจน์และคีย์หลักของรายการเพื่อสร้างรายการอัปเดต (L28)
  • เพิ่มรายการอัปเดตไปยังชิ้นส่วนธุรกรรม (L35)
  • กำหนดและตรวจสอบการป้อนข้อมูลธุรกรรม (L38–39)
  • ดำเนินการธุรกรรม (L43)

ตัวอย่างข้อมูลด้านบนประกอบด้วยส่วนต่างๆดังต่อไปนี้:

  • สร้างคีย์หลักของรายการ (L3–7)
  • เตรียมและสร้างการแสดงออก (L12-13)
  • ใช้นิพจน์เพื่อกำหนดGetItemInput (L18)
  • รับไอเทม (L25)
  • ผลลัพธ์ที่ไม่เป็นอันตรายต่อโครงสร้างผลิตภัณฑ์ (L30)

รับบันทึก (โดยใช้แบบสอบถาม)

ตัวอย่างข้อมูลด้านบนประกอบด้วยส่วนต่างๆดังต่อไปนี้:

  • เตรียมและสร้างนิพจน์ที่มีตัวกรองและเงื่อนไขสำคัญ (L5-12)
  • ใช้นิพจน์เพื่อกำหนดQueryInput (L20)
  • ดำเนินการค้นหา (L28)
  • ผลการสืบค้นที่ไม่ชัดเจนไปยังชิ้นส่วนรายการ (L37)

รับบันทึก (โดยใช้ Scan)

ตัวอย่างข้อมูลด้านบนประกอบด้วยส่วนต่างๆดังต่อไปนี้:

  • เตรียมและสร้างนิพจน์ตัวกรอง (L3–8)
  • ใช้นิพจน์ตัวกรองเมื่อกำหนดScanInput (L13)
  • ดำเนินการสแกน (L20)
  • ผลการสแกน unmarshal ไปยังชิ้นส่วนรายการ (L29)

ลบบันทึก

ตัวอย่างข้อมูลด้านบนประกอบด้วยส่วนต่างๆดังต่อไปนี้:

  • สร้างคีย์หลักของรายการ (L3–7)
  • กำหนดDeleteItemInput (L12)
  • การโทรลบรายการ (L17)

อ้างอิง

  • การออกแบบ NoSQL สำหรับ DynamoDB
  • อะไรทำไมและเมื่อใดของการออกแบบตารางเดียวด้วย DynamoDB
  • จากฐานข้อมูลเชิงสัมพันธ์ไปยังตาราง DynamoDB เดียว: การสำรวจทีละขั้นตอน
  • การจำลองข้อ จำกัด เฉพาะของ Amazon DynamoDB โดยใช้ธุรกรรม
  • ตัวอย่าง Amazon DynamoDB การใช้ AWS SDK for Go
  • go-dynamodb - ตัวอย่างซอร์สโค้ดบริการบน GitHub

Suggested posts

DevOps-1: เชื่อมต่อแอปพลิเคชัน Golang ของคุณกับฐานข้อมูล PostgreSQL

DevOps-1: เชื่อมต่อแอปพลิเคชัน Golang ของคุณกับฐานข้อมูล PostgreSQL

ในบทความนี้ เราจะพยายามเชื่อมต่อแอปพลิเคชัน golang CRUD อย่างง่ายกับฐานข้อมูล postgreSQL มาสร้างแอปพลิเคชันของเราก่อน

DevOps-2: เชื่อมต่อแอปพลิเคชัน Golang ของคุณกับฐานข้อมูล PostgreSQL

DevOps-2: เชื่อมต่อแอปพลิเคชัน Golang ของคุณกับฐานข้อมูล PostgreSQL

หากต้องการอ่านภาคแรก คลิกที่นี่ ซู! เฮ้คนดี! ขอขอบคุณที่อ่านส่วนที่ 2 ของซีรีส์ต่อไปเพื่อเชื่อมต่อแอปพลิเคชัน golang ของคุณกับฐานข้อมูล postgresql ในบทความที่แล้ว เราได้เขียนโปรแกรมแอปพลิเคชัน golang CRUD อย่างง่าย และเรียกใช้แอปโดยเทียบท่าฐานข้อมูล postgreSQL

Related posts

การรวบรวม OSINT เพื่อการล่าภัยคุกคาม

การรวบรวม OSINT เพื่อการล่าภัยคุกคาม

สวัสดีชาวไซเบอร์! ยินดีต้อนรับกลับสู่ OSINT สำหรับซีรี่ส์การล่าภัยคุกคาม ในบทความแรก ฉันได้ให้ภาพรวมของ OSINT และความสำคัญในการตามล่าภัยคุกคาม

บทสนทนาอันตราย

บทสนทนาอันตราย

หากเราต้องการจะเติบโตบนโลกใบนี้ต่อไป เราจะต้องสนทนาที่อันตราย คนที่ท้าทายสิ่งที่เราทำ สิ่งที่เรากำลังทำ และสิ่งที่เรากำลังจะทำต่อไป (หรือกำลังวางแผนที่จะทำ)

"เปิดร่องลึกบาดาลมาเรียนา: เปิดเผยความจริงอันน่าสะพรึงกลัวของก้นบึ้ง"

"เปิดร่องลึกบาดาลมาเรียนา: เปิดเผยความจริงอันน่าสะพรึงกลัวของก้นบึ้ง"

บทนำ:ยินดีต้อนรับ ผู้อ่านผู้กล้าหาญ สู่การเดินทางที่จะพาเราไปสู่ความลึกที่มืดมนที่สุดบนโลกใบนี้ ในบล็อกนี้ เราเจาะลึกโลกอันน่าพิศวงของร่องลึกบาดาลมาเรียนา เปิดเผยความลับที่ซ่อนอยู่ และเปิดเผยความจริงอันน่าสะพรึงกลัวที่อยู่ใต้พื้นผิวของมัน

ทบทวนสื่อ: ความจริง 5 ประการของ McChesney และอนาคตของการสื่อสาร

ในโลกปัจจุบันที่เชื่อมต่อกันมากเกินไป ระบบสื่อมีบทบาทสำคัญในการกำหนดความคิดเห็นของสาธารณชน และเป็นผลให้เกิดขึ้นในการตัดสินใจตามระบอบประชาธิปไตย ในการวิเคราะห์อย่างลึกซึ้งเกี่ยวกับเศรษฐศาสตร์การเมืองของการสื่อสาร นักวิชาการ Robert McChesney ท้าทายภูมิปัญญาดั้งเดิมและนำเสนอสิ่งที่เขาเรียกว่า "ความจริงห้าประการ" เกี่ยวกับสื่อ