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

ในโมดูลนี้ คุณจะได้เรียนรู้เกี่ยวกับการปรับมาตรฐานบางส่วน

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

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

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

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

ในขั้นตอนด้านล่างนี้ คุณจะมองเห็นวิธีการใช้การปรับมาตรฐานบางส่วน และการเรียกใช้ API BatchGetItem เพื่อจัดการสถานการณ์นี้

ระยะเวลาที่ใช้ในการศึกษาโมดูล: 20 นาที


  • ขั้นตอนที่ 1: ใช้การปรับมาตรฐานบางส่วนเพื่อค้นหาผู้ใช้ที่ถูกติดตาม

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

    ดังที่ระบุไว้ในข้อมูลเบื้องต้นของโมดูลนี้ คุณอาจต้องการใช้เทคนิคการปรับมาตรฐานบางส่วน เกี่ยวกับมิตรภาพและผู้ใช้ นอกเหนือจากการจัดเก็บข้อมูลทั้งหมดเกี่ยวกับผู้ใช้แต่ละรายในเอนทิตี มิตรภาพ คุณจะสามารถใช้ BatchGetItem API เพื่อเรียกดูข้อมูลเกี่ยวกับผู้ใช้ในเอนทิตี มิตรภาพ ได้

    ในโค้ดที่คุณดาวน์โหลด จะมีไฟล์ในไดเรกทอรี application/ ที่เรียกว่า find_and_enrich_following_for_user.py เนื้อหาของสคริปต์นี้มีดังต่อไปนี้

    import boto3
    
    from entities import User
    
    dynamodb = boto3.client('dynamodb')
    
    USERNAME = "haroldwatkins"
    
    
    def find_and_enrich_following_for_user(username):
        friend_value = "#FRIEND#{}".format(username)
        resp = dynamodb.query(
            TableName='quick-photos',
            IndexName='InvertedIndex',
            KeyConditionExpression="SK = :sk",
            ExpressionAttributeValues={":sk": {"S": friend_value}},
            ScanIndexForward=True
        )
    
        keys = [
            {
                "PK": {"S": "USER#{}".format(item["followedUser"]["S"])},
                "SK": {"S": "#METADATA#{}".format(item["followedUser"]["S"])},
            }
            for item in resp["Items"]
        ]
    
        friends = dynamodb.batch_get_item(
            RequestItems={
                "quick-photos": {
                    "Keys": keys
                }
            }
        )
    
        enriched_friends =  [User(item) for item in friends['Responses']['quick-photos']]
    
        return enriched_friends
    
    
    
    follows = find_and_enrich_following_for_user(USERNAME)
    
    print("Users followed by {}:".format(USERNAME))
    for follow in follows:
        print(follow)

    ฟังก์ชัน find_and_enrich_following_for_user จะคล้ายคลึงกับฟังก์ชัน find_follower_for_user ที่คุณใช้ในโมดูลล่าสุด ฟังก์ชันดังกล่าวจะยอมรับชื่อผู้ใช้สำหรับบุคคลที่คุณต้องการค้นหาผู้ใช้ที่ถูกติดตาม ฟังก์ชันจะทำการส่งคำขอ สืบค้น ก่อน โดยใช้ดัชนีย้อนกลับเพื่อค้นหาผู้ใช้ทั้งหมดที่ชื่อผู้ใช้ที่ระบุกำลังติดตามอยู่ จากนั้น ระบบจะรวบรวม BatchGetItem เพื่อดึงข้อมูลเอนทิตี ผู้ใช้ ทั้งหมด สำหรับผู้ใช้ที่ถูกติดตามแต่ละราย และแสดงค่าเอนทิตีดังกล่าว

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

    ปฏิบัติการสคริปต์โดยการใช้คำสั่งต่อไปนี้ในเทอร์มินัลของคุณ

    python application/find_and_enrich_following_for_user.py

    คอนโซลของคุณควรแสดงเอาต์พุตเป็นรายการผู้ใช้ที่ติดตามโดยชื่อผู้ใช้ที่กำหนด

    Users followed by haroldwatkins:
    User<ppierce -- Ernest Mccarty>
    User<vpadilla -- Jonathan Scott>
    User<david25 -- Abigail Alvarez>
    User<jacksonjason -- John Perry>
    User<chasevang -- Leah Miller>
    User<frankhall -- Stephanie Fisher>
    User<nmitchell -- Amanda Green>
    User<tmartinez -- Kristin Stevens>
    User<natasha87 -- Walter Carlson>
    User<geoffrey32 -- Mary Martin>
    

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

  • สรุป

    ในโมดูลนี้ เราจะได้เห็นว่าการปรับมาตรฐานบางส่วนและการเรียกใช้ AI BatchGetItem จะเป็นประโยชน์ได้อย่างไร ในการรักษาความถูกต้องของข้อมูลตลอดทั้งอ็อบเจ็กต์ และยังคงรักษาระดับคำขอการสืบค้นให้อยู่ในระดับต่ำ

    ในโมดูลถัดไป เราจะใช้การดำเนินการ DynamoDB เนื่องจากเราจะเพิ่มการโต้ตอบไปยังรูปภาพ หรือติดตามผู้ใช้