วิธีสร้างโมเดลข้อมูลของคุณให้ทำงานกับ DynamoDB ที่ใช้ NoSQL ของ Amazon Web Services
ทำไมต้อง NoSQL?
ปัจจุบันการจัดเก็บข้อมูลมีราคาถูกและพลังในการคำนวณมีราคาแพง NoSQL ใช้ประโยชน์จากข้อเท็จจริงนี้และเสียสละพื้นที่จัดเก็บข้อมูลบางส่วนเพื่อให้สามารถสืบค้นในการคำนวณได้ง่ายขึ้น โดยพื้นฐานแล้ว ความหมายก็คือ เมื่อออกแบบโมเดลข้อมูล NoSQL คุณจะต้องคิดถึงวิธีที่จะทำให้การสืบค้นไปยังฐานข้อมูลของคุณง่ายขึ้น เมื่อใช้อย่างถูกต้อง NoSQL อาจเป็นโซลูชันที่คุ้มค่ากว่าฐานข้อมูลเชิงสัมพันธ์มาก
ทำไมต้อง DynamoDB?
Amazon DynamoDB เป็นฐานข้อมูลคีย์-ค่าและเอกสารที่ได้รับการจัดการเต็มรูปแบบ หลายภูมิภาค และปรับขนาดอัตโนมัติ เพื่อให้คุณไม่ต้องกังวลเกี่ยวกับโครงสร้างพื้นฐานหรือศูนย์ข้อมูล DynamoDB ยังมีโมเดลราคา "ความจุตามความต้องการ" อีกด้วย ทำให้แอปพลิเคชันทุกขนาดเข้าถึงได้ง่ายมากเพื่อเริ่มต้นใช้งานได้ทันทีโดยไม่ต้องกังวลเรื่องการจัดเตรียมความจุหรือต้องอัปเกรดในภายหลัง
การทำความเข้าใจพื้นฐาน
ไม่เหมือนกับฐานข้อมูลเชิงสัมพันธ์ เช่น MySQL ตรงที่ NoSQL ต้องการให้คุณถามคำถามอยู่ตลอดเวลาว่าข้อมูลจะถูกสืบค้นอย่างไร การถามคำถามเหล่านี้จะนำคุณไปสู่เส้นทางของการจัดระเบียบรายการและวิธีแยกรายการในลักษณะที่เอื้อต่อการสืบค้นที่รวดเร็ว ขั้นตอนแรกคือการสร้างคีย์หลักสำหรับรายการของคุณซึ่งประกอบด้วย คีย์พาร์ติชัน และ คีย์การเรียงลำดับ
หมายเหตุ: คุณสามารถใช้เพียงพาร์ติชั่นคีย์เป็นคีย์หลักได้ แต่สำหรับกรณีส่วนใหญ่ คุณจะต้องการใช้ประโยชน์จากคีย์การเรียงลำดับด้วย
รหัสพาร์ติชัน
ตาราง DynamoDB แบ่งออกเป็นพาร์ติชัน DynamoDB ใช้คีย์พาร์ติชันเป็นอินพุตไปยังฟังก์ชันแฮชภายใน ซึ่งผลลัพธ์จะกำหนดว่ารายการจะถูกจัดเก็บในพาร์ติชันใด
พาร์ทิชันร้อน
สิ่งสำคัญคือต้องแน่ใจว่าคีย์พาร์ติชั่นของคุณแยกรายการของคุณเพื่อให้ปริมาณงานของคุณถูกกระจายอย่างเท่าเทียมกันระหว่างพาร์ติชั่นต่างๆ เพื่อหลีกเลี่ยงปัญหาพาร์ติชั่น "ร้อน"
ตัวอย่างเช่น สมมติว่าตารางของคุณแบ่งออกเป็น 3 พาร์ติชัน และคุณได้จัดเตรียม RCU (หน่วยความจุการอ่าน) 3 รายการให้กับตารางของคุณ นั่นหมายความว่าแต่ละพาร์ติชันจะสามารถเข้าถึง 1 RCU หาก 1 พาร์ติชันถูกโจมตีบ่อยกว่าอีก 2 พาร์ติชันอื่นมาก คุณเสี่ยงที่จะถูกควบคุมปริมาณเนื่องจากคุณอาจใช้ 1 RCU นั้นทั้งหมด ในขณะเดียวกัน คุณยังคงชำระค่า RCU 3 รายการ
คุณสามารถหาข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้ได้ในเอกสารอย่างเป็นทางการของ AWS: การออกแบบคีย์พาร์ติชันเพื่อกระจายปริมาณงานของคุณอย่างเท่าเทียมกัน
คีย์การเรียงลำดับ
รายการทั้งหมดที่มีพาร์ติชั่นคีย์เดียวกันจะถูกจัดเก็บไว้ด้วยกันและเรียงลำดับตามคีย์การเรียงลำดับ โดยการปฏิบัติตามรูปแบบนี้ คุณสามารถสืบค้นหลายรายการได้อย่างมีประสิทธิภาพโดยใช้ เฉพาะคีย์พาร์ติชัน
ตัวอย่างของการสร้างแบบจำลองข้อมูล
สมมติว่าคุณกำลังออกแบบแอปพลิเคชันที่คุณต้องการจัดเก็บข้อมูลเกี่ยวกับการแข่งขันกีฬา เราสามารถพูดได้ว่าแต่ละทัวร์นาเมนท์มีทีม ผู้เล่น และแมตช์การแข่งขัน ทัวร์นาเมนต์นี้จะมีข้อมูลพื้นฐาน เช่น สถานที่ วันที่ เกม และรางวัล
แนวทางทั่วไปในการสร้างแบบจำลองข้อมูลใน NoSQL คือการคิดในแง่ของลำดับชั้น แล้วอะไรจะเกิดขึ้นเหนือลำดับชั้นของเรา? ลองคิดแบบนี้: หากไม่มีการแข่งขัน เราจะไม่มีทีม ผู้เล่น หรือการแข่งขัน ทัวร์นาเมนต์นำเสนอบริบทที่เชื่อมโยงรายการอื่นๆ ทั้งหมดเข้าด้วยกัน ดังนั้น สำหรับแต่ละทัวร์นาเมนต์ เราต้องการจัดกลุ่มรายการทั้งหมดไว้เคียงข้างกัน เพื่อให้เราสามารถดึงข้อมูลทัวร์นาเมนต์ทั้งหมดได้อย่างมีประสิทธิภาพใน แบบสอบถามเดียว
เราจะต้องแบ่งแต่ละทัวร์นาเมนต์ของเราตามตัวระบุที่ไม่ซ้ำกันแต่มีการกระจายอย่างสม่ำเสมอ สำหรับสิ่งนี้ ฉันขอแนะนำให้ใช้ UUIDv4 เพื่อสร้างรหัสการแข่งขันที่ไม่ซ้ำใคร มาดูกันว่าสิ่งนี้จะเป็นอย่างไรในตาราง DynamoDB รหัสการแข่งขัน UUIDv4 ของเราทำหน้าที่เป็นพาร์ติชั่นคีย์ของเรา
อย่างที่คุณเห็น เรามี 4 รายการที่มีคีย์พาร์ติชันเดียวกันและจัดเรียงตามคีย์การเรียงลำดับ คุณจะสังเกตเห็นว่าแต่ละรายการมีคำนำหน้าด้วยคำอธิบายหรือเพียงค่าฮาร์ดโค้ด ฉันจะอธิบายเพิ่มเติมว่าทำไมเราถึงทำเช่นนี้ในภายหลัง นอกจากนี้ แต่ละรายการเหล่านี้ยังมีชุดคุณลักษณะเฉพาะของตัวเอง และสามารถดึงข้อมูลทั้งหมดได้โดยการเรียกคำสั่งง่ายๆ เพียงครั้งเดียวไปยัง DynamoDB
{ "TableName": "tournaments", "KeyConditionExpression": "partitionKey = :tournamentId", "ExpressionAttributeValues": { ":tournamentId": "983d39a3-bdd6-4b61-88d5-58595d555b81" } }
จะเป็นอย่างไรถ้าคุณต้องการเฉพาะทีมตามรหัสทัวร์นาเมนต์ที่กำหนด?
นี่คือจุดที่คำนำหน้า team-
มีประโยชน์ เนื่องจากเรานำหน้าคีย์การเรียงลำดับรายการของทีมทั้งหมดด้วย team-
เราจึงสามารถดำเนินการฟังก์ชันพิเศษใน KeyConditionExpression ของเราได้ — begins_with
การเรียกแบบสอบถามนี้จะดึงข้อมูลทีมทั้งหมดสำหรับรหัสการแข่งขันที่กำหนด (คีย์พาร์ติชัน)
{ "TableName": "tournaments", "KeyConditionExpression": "partitionKey = :tournamentId and begins_with(sortKey, :teamPrefix)", "ExpressionAttributeValues": { ":teamPrefix": "team-", ":tournamentId": "983d39a3-bdd6-4b61-88d5-58595d555b81" } }
จะทำอย่างไรถ้าคุณต้องการเพียงรายละเอียดพื้นฐาน?
เราดำเนินการเรียกรับรายการ DynamoDB ได้เนื่องจากเราทราบทั้งคีย์พาร์ติชันและคีย์การเรียงลำดับ
{ "TableName": "tournaments", "Key": { "partitionKey": "983d39a3-bdd6-4b61-88d5-58595d555b81", "sortKey": "tournament-details" } }
ห่อ
ฉันหวังว่าสิ่งนี้จะช่วยคุณในการเดินทางของการสร้างแบบจำลองข้อมูลสำหรับฐานข้อมูล NoSQL เช่น DynamoDB แน่นอนว่าฉันต้องใช้เวลาสักพักกว่าจะเข้าใจรูปแบบและเทคนิคบางอย่างที่ฉันได้พยายามร่างไว้ที่นี่ อย่างไรก็ตาม ฉันต้องการแบ่งปันความรู้ที่ได้รับโดยหวังว่าจะช่วยให้คุณได้เปรียบในเรื่องการสร้างแบบจำลองข้อมูล
หากคุณสนใจที่จะเรียนรู้เพิ่มเติมเกี่ยวกับบริการของ AWS
ขอขอบคุณที่อ่านและขอให้โชคดีกับโครงการของคุณ! แสดงความคิดเห็นหรือส่งข้อความถึงฉันหากคุณมีคำถามใด ๆ