ตารางเชิงสัมพันธ์กับ Dynamodb

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

ตารางปัจจุบัน:

Student: StudentId(PK), Email, First name, Last name, Password, SchoolId(FK)
School: SchoolId(PK), Name, Description

ฉันกำลังคิดที่จะรวมตารางเหล่านี้ใน DynamoDB และใช้ SchoolId เป็นคีย์พาร์ติชัน ส่วน StudentId เป็นคีย์การเรียงลำดับ อย่างไรก็ตาม ฉันเห็นตัวอย่างที่คล้ายกันบางตัวอย่างใช้ StudentId เป็นคีย์พาร์ติชัน

แล้วฉันก็รู้ว่าเราใช้ "ชื่อผู้ใช้" ในแต่ละฟังก์ชันการเข้าสู่ระบบ ดังนั้นแอปพลิเคชันจะสืบค้นด้วย "ชื่อผู้ใช้" (บางครั้งใช้รหัสผ่านหรือโทเค็นการรับรองความถูกต้อง) บ่อยครั้ง สถานการณ์นี้ทำให้ฉันคิดเกี่ยวกับ; SchoolId เป็นคีย์พาร์ติชัน และชื่อผู้ใช้เป็นคีย์การเรียงลำดับ

ฉันต้องการแนวคิดบางอย่างเกี่ยวกับแนวทางปฏิบัติที่ดีที่สุดในกรณีนั้น และคำแนะนำเพื่อให้ฉันเข้าใจแนวคิด NoSQL และ DynamoDb ได้ดียิ่งขึ้น


person Orhun Karapinar    schedule 14.03.2019    source แหล่งที่มา


คำตอบ (1)


ใน NoSql คุณควรพยายามแสดงรายการกรณีการใช้งานทั้งหมดของคุณก่อน จากนั้นจึงลองสร้างแบบจำลองสคีมาตาราง

ด้านล่างนี้คือกรณีการใช้งานที่ฉันเห็นในแอปพลิเคชันของคุณ

  1. รับข้อมูลผู้ใช้สำหรับผู้ใช้หนึ่งรายด้วยรหัสผู้ใช้ (รหัสผ่าน อายุ ชื่อ...)

  2. รับข้อมูลโรงเรียนสำหรับผู้ใช้ที่มีรหัสผู้ใช้ (className, schoolName)

  3. รับนักเรียนทั้งหมดในโรงเรียนเดียว

  4. รับนักเรียนทุกคนในชั้นเรียนเดียวของโรงเรียนเดียว

จากรูปแบบการเข้าถึงที่กำหนดเหล่านี้ ฉันจะออกแบบสคีมาได้อย่างไร

|    pk     |     sk        |   GSI1 PK          |  GSI1 SK            |  
|  12345    |    metadata   |                    |                     | Age:13 | Last name: Singh | Name:Rohan | ...
|  12345    |    schoolMeta |  SchoolName: DPS   | DPS#class5          | className:5 | 

ด้วยสคีมาข้างต้น คุณสามารถแก้ไขกรณีการใช้งานที่ระบุได้

  1. รับข้อมูลผู้ใช้สำหรับผู้ใช้หนึ่งรายด้วย userId

    Select * where pk=userId and sk=metadata

  2. รับข้อมูลโรงเรียนสำหรับผู้ใช้ด้วยรหัสผู้ใช้

    Select * where pk=userId and sk=schoolMeta

  3. รับนักเรียนทั้งหมดในโรงเรียนเดียว

    Select * where pk=SchoolId from table=GSI1

  4. รับนักเรียนทุกคนในชั้นเรียนเดียว

    Select * where pk=SchoolId and sk startswith SchoolId#className from table=GSI1

แต่สคีมาที่กำหนดได้รับข้อเสียเปรียบ

  1. หากคุณต้องการเปลี่ยนชื่อโรงเรียน คุณจะต้องอัปเดตแถวมากเกินไป
person best wishes    schedule 15.03.2019
comment
ขอบคุณสำหรับคำตอบโดยละเอียด สิ่งนี้มีประโยชน์มาก ฉันมีคำถามอีกสองข้อเท่านั้น สำหรับกรณีการใช้งานครั้งแรก: รับข้อมูลผู้ใช้สำหรับผู้ใช้หนึ่งรายด้วยรหัสผู้ใช้ (รหัสผ่าน อายุ ชื่อ...) แอปพลิเคชันจะได้รับข้อมูลผู้ใช้ด้วยชื่อผู้ใช้แทนรหัสผู้ใช้ ในกรณีนั้นคุณคิดว่าฉันจำเป็นต้องใช้ชื่อผู้ใช้เป็นพาร์ติชั่นคีย์หรือไม่? และคำถามที่สองของฉันเกี่ยวกับคีย์การเรียงลำดับ คุณหมายถึงอะไรโดยการพูดถึงเมตาดาต้าในกรณีของฉัน ขอขอบคุณอีกครั้งสำหรับคำตอบโดยละเอียด - person Orhun Karapinar; 16.03.2019
comment
pk ควรเป็นกุญแจที่คุณคิดว่าจะพยายามดึงข้อมูล ไม่มีข้อจำกัดในเรื่องนี้ สิ่งเดียวที่จับได้คือควรสุ่มเพียงพอเพื่อไม่ให้พาร์ติชันร้อนเกิดขึ้น metadata เป็นเพียงคีย์ที่คุณสามารถใช้ชื่อคงที่อื่นๆ ได้เช่นกัน สิ่งเดียวที่ควรทราบคือ ชื่อนี้ไม่สามารถเปลี่ยนแปลงได้ในภายหลัง และแอปพลิเคชันควรทราบชื่อนี้เพื่อทำการดึงข้อมูล - person best wishes; 16.03.2019