Dalam modul sebelumnya, Anda telah menambahkan indeks inversi ke tabel. Indeks inversi menambahkan pola kueri tambahan untuk data relasional. Namun, kami melihat masih ada masalah. Meskipun kami dapat membuat kueri semua entitas Pertemanan untuk entitas Pengguna tertentu, entitas Pertemanan tidak berisi informasi tentang pengguna yang diikuti.

Dalam modul ini, Anda akan mempelajari tentang normalisasi parsial.

Dalam modul kedua, kami melihat Anda tidak boleh mencoba memalsukan pola relasional ketika membuat pemodelan dengan DynamoDB. Satu tenant inti model relasional adalah normalisasi data di mana Anda menghindari duplikasi data di beberapa tempat. Normalisasi adalah pola yang bagus dalam database relasional, tetapi Anda mungkin memerlukan penggabungan yang cukup mahal untuk menyusun kembali data Anda saat membuat kueri.

Dengan DynamoDB, Anda sering ingin mendenormalisasi data Anda. Denormalisasi membantu untuk menghindari penggabungan dan meningkatkan kinerja kueri. Untuk melakukannya, Anda dapat menyalin atribut dari satu item ke item lain yang merujuknya guna menghindari pengambilan kedua item selama kueri.

Namun, ada kalanya ketika denormalisasi dapat menyulitkan model data Anda. Misalnya, model data memiliki entitas Pertemanan yang merujuk pada pengguna yang diikuti dan pengguna yang mengikuti. Anda dapat menyalin semua atribut dari setiap entitas Pengguna ke entitas Pertemanan saat membuat entitas Pertemanan. Kemudian, ketika Anda mengambil entitas Pertemanan, Anda juga akan memiliki semua detail kedua pengguna.

Hal ini dapat menimbulkan masalah setiap kali pengguna mengubah informasi di profil mereka. Misalnya, jika pengguna mengubah foto profil mereka, data di setiap entitas Pertemanan yang meliputi pengguna tersebut akan kedaluwarsa. Anda perlu memperbarui setiap entitas Pertemanan yang meliputi pengguna tersebut setiap kali ada pembaruan.

Pada langkah-langkah di bawah ini, Anda akan melihat cara menggunakan normalisasi parsial dan panggilan API BatchGetItem untuk menangani situasi ini.

Waktu untuk Menyelesaikan Modul: 20 Menit


  • Langkah 1: Menggunakan normalisasi parsial untuk menemukan pengguna yang diikuti

    Pada langkah ini, Anda akan melihat cara menemukan pengguna yang diikuti. Ini adalah pengguna yang diikuti pengguna tertentu di aplikasi Anda. Anda juga akan melihat cara mengambil semua data tentang pengguna yang diikuti.

    Seperti yang disebutkan dalam pengantar modul ini, Anda mungkin ingin menggunakan teknik normalisasi parsial dalam pertemanan dan pengguna. Daripada menyimpan informasi lengkap tentang setiap pengguna di entitas Pertemanan, Anda dapat menggunakan API BatchGetItem untuk mengambil informasi tentang pengguna di entitas Pertemanan.

    Di kode yang Anda unduh, terdapat file di direktori application/ bernama find_and_enrich_following_for_user.py. Konten skrip ini ditunjukkan di bawah ini.

    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)

    Fungsi find_and_enrich_following_for_user serupa dengan fungsi find_follower_for_user yang Anda gunakan dalam modul terakhir. Fungsi ini menerima nama pengguna untuk siapa Anda ingin menemukan pengguna yang diikuti. Pertama, fungsi membuat permintaan Kueri menggunakan indeks inversi untuk menemukan semua pengguna yang diikuti nama pengguna tertentu. Kemudian, fungsi menyusun BatchGetItem untuk mengambil entitas Pengguna lengkap bagi setiap pengguna yang diikuti dan menghasilkan entitas tersebut.

    Dua permintaan untuk DynamoDB akan dihasilkan, alih-alih idealnya satu permintaan. Namun, ini memenuhi pola akses yang cukup kompleks, dan menghindari kebutuhan untuk terus memperbarui entitas Pertemanan setiap kali profil pengguna diperbarui. Normalisasi parsial ini dapat menjadi alat yang hebat untuk kebutuhan pemodelan Anda.

    Eksekusi skrip ini dengan menjalankan perintah berikut di terminal Anda.

    python application/find_and_enrich_following_for_user.py

    Konsol Anda harus menampilkan daftar pengguna yang diikuti menurut nama pengguna tertentu.

    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>
    

    Perhatikan bahwa sekarang Anda berurusan dengan entitas Pengguna alih-alih entitas Pertemanan. Entitas Pengguna akan memiliki informasi paling lengkap dan terbaru tentang pengguna Anda. Meskipun memerlukan dua permintaan untuk menghasilkannya, ini mungkin masih menjadi pilihan yang lebih baik daripada denormalisasi penuh dan masalah integritas data yang diakibatkannya

  • Penutup

    Dalam modul ini, kami melihat bagaimana normalisasi parsial dan panggilan API BatchGetItem dapat membantu menjaga integritas data di seluruh objek sekaligus menjaga permintaan kueri tetap rendah.

    Dalam modul berikutnya, kami akan menggunakan transaksi DynamoDB saat menambahkan reaksi ke foto atau saat mengikuti pengguna.