Tabel relasional ke Dynamodb

Saya sudah lama bekerja dengan database relasional, dan sekarang saya akan bekerja dengan DynamoDB. Setelah bekerja dengan database relasional, saya kesulitan mendesain beberapa tabel SQL kami saat ini di DynamoDB. Terutama, memutuskan tentang kunci partisi dan pengurutan. Saya akan mencoba menjelaskan dengan sebuah contoh:

Tabel Saat Ini:

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

Saya berpikir untuk menggabungkan tabel-tabel ini di DynamoDB dan menggunakan SchoolId sebagai Kunci Partisi, StudentId sebagai kunci pengurutan. Namun, saya melihat beberapa contoh serupa menggunakan StudentId sebagai Kunci Partisi.

Dan kemudian saya menyadari, kami menggunakan "nama pengguna" di setiap fungsi login, sehingga aplikasi akan sering menanyakan "nama pengguna" (terkadang dengan kata sandi, atau token autentikasi). Situasi ini membuat saya berpikir tentang; SchoolId sebagai Kunci Partisi dan Nama Pengguna sebagai kunci pengurutan.

Saya memerlukan beberapa ide tentang praktik terbaik dalam kasus tersebut dan beberapa saran untuk memberi saya pemahaman yang lebih baik tentang konsep NoSQL dan DynamoDb.


person Orhun Karapinar    schedule 14.03.2019    source sumber


Jawaban (1)


Di NoSql Anda harus mencoba membuat daftar semua kasus penggunaan Anda terlebih dahulu dan kemudian mencoba memodelkan skema tabel.

Di bawah ini adalah kasus penggunaan yang saya lihat di aplikasi Anda

  1. Dapatkan info pengguna untuk satu pengguna dengan userId (kata sandi, usia, nama,...)

  2. Dapatkan info Sekolah untuk pengguna dengan userId (className, schoolName)

  3. Dapatkan Semua siswa di satu sekolah.

  4. Dapatkan Semua siswa dalam satu kelas di satu sekolah.

Berdasarkan pola akses yang diberikan, inilah cara saya merancang skema

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

Dengan skema di atas Anda dapat menyelesaikan kasus penggunaan yang teridentifikasi sebagai

  1. Dapatkan info pengguna untuk satu pengguna dengan userId

    Select * where pk=userId and sk=metadata

  2. Dapatkan info sekolah untuk pengguna dengan userId

    Select * where pk=userId and sk=schoolMeta

  3. Dapatkan Semua siswa di satu sekolah.

    Select * where pk=SchoolId from table=GSI1

  4. Dapatkan Semua siswa dalam satu kelas.

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

Tetapi skema yang diberikan memiliki kelemahan

  1. Jika Anda ingin mengubah nama sekolah, Anda harus memperbarui terlalu banyak baris.
person best wishes    schedule 15.03.2019
comment
Terima kasih atas jawaban detailnya, ini sangat membantu. Saya hanya punya dua pertanyaan lagi; untuk kasus penggunaan pertama: Dapatkan info pengguna untuk satu pengguna dengan userId (password, age, name,...) , aplikasi akan mendapatkan info pengguna dengan nama pengguna, bukan userID. Kalau begitu, menurut Anda apakah saya perlu menggunakan nama pengguna sebagai kunci partisi? Dan pertanyaan kedua saya adalah tentang kunci pengurutan, apa yang Anda maksud dengan mengatakan metadata dalam kasus saya. Sekali lagi terima kasih atas jawaban detailnya. - person Orhun Karapinar; 16.03.2019
comment
pk harus menjadi kunci yang menurut Anda akan Anda coba lakukan pengambilan. Tidak ada batasan untuk itu, satu-satunya kendala adalah bahwa partisi tersebut harus cukup acak sehingga partisi panas tidak terjadi. metadata hanyalah sebuah kunci, Anda juga dapat menggunakan nama konstanta lainnya, satu-satunya hal yang perlu diperhatikan adalah, nama ini tidak dapat diubah nanti dan aplikasi harus mengetahui nama ini untuk melakukan pengambilan - person best wishes; 16.03.2019