Desain skema jejaring sosial di DynamoDB - Amazon DynamoDB

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Desain skema jejaring sosial di DynamoDB

Kasus penggunaan bisnis jejaring sosial

Kasus penggunaan ini membahas penggunaan DynamoDB sebagai jejaring sosial. Jejaring sosial adalah layanan online yang memungkinkan berbagai pengguna berinteraksi satu sama lain. Jejaring sosial yang akan kita desain akan memungkinkan pengguna melihat garis waktu yang terdiri dari postingan mereka, pengikut mereka, orang yang mereka ikuti, dan postingan yang ditulis oleh orang yang mereka ikuti. Pola akses untuk desain skema ini adalah:

  • Mendapatkan informasi pengguna untuk userID tertentu

  • Mendapatkan daftar pengikut untuk userID tertentu

  • Mendapatkan daftar orang yang diikuti untuk userID tertentu

  • Mendapatkan daftar postingan untuk userID tertentu

  • Mendapatkan daftar pengguna yang menyukai postingan untuk postID tertentu

  • Mendapatkan jumlah suka untuk postID tertentu

  • Mendapatkan lini masa untuk userID tertentu

Diagram hubungan entitas jejaring sosial

Ini adalah diagram hubungan entitas (ERD) yang akan kita gunakan untuk desain skema jejaring sosial.

ERDuntuk aplikasi jejaring sosial yang menunjukkan entitas, seperti User, Post, dan Follower.

Pola akses jejaring sosial

Ini adalah pola akses yang akan kita pertimbangkan untuk desain skema jaringan sosial.

  • getUserInfoByUserID

  • getFollowerListByUserID

  • getFollowingListByUserID

  • getPostListByUserID

  • getUserLikesByPostID

  • getLikeCountByPostID

  • getTimelineByUserID

Evolusi desain skema jejaring sosial

DynamoDB adalah database SQL No, sehingga tidak memungkinkan Anda untuk melakukan join - operasi yang menggabungkan data dari beberapa database. Pelanggan yang tidak terbiasa dengan DynamoDB mungkin menerapkan filosofi desain sistem manajemen basis data relasional RDBMS (seperti membuat tabel untuk setiap entitas) ke DynamoDB ketika mereka tidak perlu melakukannya. Tujuan desain tabel tunggal DynamoDB adalah untuk menulis data dalam bentuk pra-penggabungan sesuai pola akses aplikasi, lalu segera menggunakan data tanpa komputasi tambahan. Untuk informasi selengkapnya, lihat Single-table vs. multi-table design in DynamoDB.

Sekarang, mari melanjutkan ke cara mengembangkan desain skema untuk menangani semua pola akses.

Langkah 1: Tangani pola akses 1 (getUserInfoByUserID)

Untuk mendapatkan informasi pengguna tertentu, kita perlu Query tabel dasar dengan kondisi kunci PK=<userID>. Operasi kueri memungkinkan Anda melakukan paginasi hasil, yang berguna ketika pengguna memiliki banyak pengikut. Untuk informasi selengkapnya tentang Kueri, lihat Menanyakan tabel di DynamoDB.

Dalam contoh, kita melacak dua jenis data untuk pengguna: yaitu "count" dan "info". "Count" pengguna mencerminkan berapa banyak pengikut yang dimiliki, berapa banyak pengguna yang diikuti, dan berapa banyak postingan yang telah dibuat. "Info" pengguna mencerminkan informasi pribadi seperti nama mereka.

Kita melihat dua jenis data yang diwakili oleh dua item di bawah ini. Item dengan "count" dalam kunci urutan (SK) lebih mungkin berubah daripada item dengan "info". DynamoDB menganggap ukuran item seperti yang muncul sebelum dan setelah pembaruan dan throughput yang disediakan akan mencerminkan ukuran item yang lebih besar. Meskipun Anda hanya memperbarui subset atribut item, UpdateItem masih akan menggunakan throughput yang disediakan dalam jumlah penuh (lebih besar dari ukuran item sebelum dan sesudah). Anda bisa mendapatkan item melalui satu operasi Query dan menggunakan UpdateItem untuk menambah atau mengurangi dari atribut numerik yang ada.

Hasil operasi Query untuk pengguna dengan ID u #12345 dan data hitungan dan info mereka.

Langkah 2: Tangani pola akses 2 (getFollowerListByUserID)

Untuk mendapatkan daftar pengguna yang mengikuti pengguna tertentu, kita perlu melakukan Query tabel dasar dengan kondisi kunci PK=<userID>#follower.

Hasil operasi Query pada tabel untuk daftar pengikut pengguna dengan ID u #12345.

Langkah 3: Tangani pola akses 3 (getFollowingListByUserID)

Untuk mendapatkan daftar pengguna yang diikuti pengguna tertentu, kita perlu melakukan Query tabel dasar dengan kondisi kunci PK=<userID>#following. Anda kemudian dapat menggunakan TransactWriteItemsoperasi untuk mengelompokkan beberapa permintaan bersama-sama dan melakukan hal berikut:

  • Tambahkan Pengguna A ke daftar pengikut Pengguna B, lalu tambahkan jumlah pengikut Pengguna B satu per satu.

  • Tambahkan Pengguna B ke daftar pengikut Pengguna A, lalu tambahkan jumlah pengikut Pengguna A satu per satu.

Hasil operasi Query pada tabel untuk mencantumkan semua pengguna pengguna dengan ID u #12345 mengikuti.

Langkah 4: Tangani pola akses 4 (getPostListByUserID)

Untuk mendapatkan daftar postingan yang dibuat pengguna tertentu, kita perlu melakukan Query tabel dasar dengan kondisi kunci PK=<userID>#post. Satu hal penting yang perlu diperhatikan di sini adalah bahwa pengguna postIDs harus inkremental: nilai PostID kedua harus lebih besar dari nilai PostID pertama (karena pengguna ingin melihat posting mereka dengan cara yang diurutkan). Anda dapat melakukan ini dengan menghasilkan postIDs berdasarkan nilai waktu seperti Universally Unique Lexicographically Sortable Identifier (). ULID

Hasil operasi Query dengan kondisi kunci untuk mendapatkan daftar posting yang dibuat oleh pengguna tertentu.

Langkah 5: Tangani pola akses 5 (getUserLikesByPostID)

Untuk mendapatkan daftar pengguna yang menyukai postingan pengguna tertentu, kita perlu melakukan Query tabel dasar dengan kondisi kunci PK=<postID>#likelist. Pendekatan ini sama dengan pola yang kita gunakan untuk mengambil daftar pengikut dan pengguna yang diikuti dalam pola akses 2 (getFollowerListByUserID) dan pola akses 3 (getFollowingListByUserID).

Hasil operasi Query dengan kondisi kunci untuk mendapatkan daftar pengguna yang menyukai posting pengguna tertentu.

Langkah 6: Tangani pola akses 6 (getLikeCountByPostID)

Untuk mendapatkan jumlah suka dalam posting tertentu, kita harus melakukan GetItem operasi pada tabel dasar dengan kondisi kunci PK=<postID>#likecount. Pola akses ini dapat menyebabkan masalah pembatasan setiap kali pengguna dengan banyak pengikut (seperti selebriti) membuat posting karena throttling terjadi ketika throughput partisi melebihi 1000 per detik. WCU Masalah ini tidak dihasilkan oleh DynamoDB, tetapi hanya muncul di DynamoDB karena berada di akhir tumpukan perangkat lunak.

Anda harus mengevaluasi apakah penting bahwa semua pengguna melihat jumlah suka secara bersamaan atau hal tersebut dapat dilakukan secara bertahap dari waktu ke waktu. Secara umum, jumlah suka postingan tidak harus langsung 100% akurat. Anda dapat menerapkan strategi ini dengan menempatkan antrean antara aplikasi Anda dan DynamoDB agar pembaruan terjadi secara berkala.

Hasil GetItem operasi dengan kondisi kunci untuk mendapatkan hitungan suka untuk posting tertentu.

Langkah 7: Tangani pola akses 7 (getTimelineByUserID)

Untuk mendapatkan lini masa pengguna tertentu, kita harus melakukan Query operasi pada tabel dasar dengan kondisi kunci PK=<userID>#timeline. Mari pertimbangkan skenario ketika pengikut pengguna perlu melihat postingan secara sinkron. Setiap kali pengguna menulis postingan, daftar pengikut mereka dibaca dan userID serta postID mereka perlahan dimasukkan ke dalam kunci lini masa semua pengikutnya. Kemudian, ketika aplikasi Anda dimulai, Anda dapat membaca kunci lini masa dengan operasi Query dan mengisi layar lini masa dengan kombinasi userID dan postID menggunakan operasi BatchGetItem untuk semua item baru. Anda tidak dapat membaca timeline dengan API panggilan, tetapi ini adalah solusi yang lebih hemat biaya jika posting dapat sering diedit.

Lini masa adalah tempat yang menampilkan postingan terbaru, jadi kita perlu cara untuk membersihkan yang lama. Alih-alih menggunakan WCU untuk menghapusnya, Anda dapat menggunakan TTLfitur DynamoDB untuk melakukannya secara gratis.

Hasil operasi Query dengan kondisi kunci untuk mendapatkan timeline untuk pengguna tertentu yang menampilkan posting terbaru mereka.

Semua pola akses dan bagaimana desain skema mengatasinya dirangkum dalam tabel di bawah ini:

Pola akses Tabel dasar//GSILSI Operasi Nilai kunci partisi Nilai kunci urutan Kondisi/filter lainnya
getUserInfoByUserID Tabel dasar Kueri PK=<userID>
getFollowerListByUserID Tabel dasar Kueri PK=<userID>#follower
getFollowingListByUserID Tabel dasar Kueri PK=<userID>#following
getPostListByUserID Tabel dasar Kueri PK=<userID>#post
getUserLikesByPostID Tabel dasar Kueri PK=<postID>#likelist
getLikeCountByPostID Tabel dasar GetItem PK=<postID>#likecount
getTimelineByUserID Tabel dasar Kueri PK=<userID>#timeline

Skema akhir jejaring sosial

Berikut adalah desain skema akhir. Untuk mengunduh desain skema ini sebagai JSON file, lihat Contoh DynamoDB di. GitHub

Tabel dasar:

Desain skema akhir dari tabel yang berisi hasil Query sebelumnya dan operasi. GetItem

Menggunakan No SQL Workbench dengan desain skema ini

Anda dapat mengimpor skema akhir ini ke No SQL Workbench, alat visual yang menyediakan pemodelan data, visualisasi data, dan fitur pengembangan kueri untuk DynamoDB, untuk mengeksplorasi lebih lanjut dan mengedit proyek baru Anda. Ikuti langkah-langkah berikut untuk memulai:

  1. Unduh No SQL Workbench. Untuk informasi selengkapnya, lihat Unduh No SQL Workbench untuk DynamoDB.

  2. Unduh file JSON skema yang tercantum di atas, yang sudah dalam format model No SQL Workbench.

  3. Impor file JSON skema ke No SQL Workbench. Untuk informasi selengkapnya, lihat Mengimpor model data yang ada.

  4. Setelah Anda mengimpor ke NOSQL Workbench, Anda dapat mengedit model data. Untuk informasi selengkapnya, lihat Mengedit model data yang ada.

  5. Untuk memvisualisasikan model data Anda, menambahkan data sampel, atau mengimpor data sampel dari CSV file, gunakan fitur Visualizer Data dari No Workbench. SQL