MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Bagaimana cara menangani dokumen melingkar di MongoDB/DynamoDB?

Sementara NoSQL umumnya merekomendasikan denormalisasi model data, yang terbaik adalah tidak memiliki daftar tak terbatas dalam satu entri database. Untuk memodelkan data ini di DynamoDB, Anda harus menggunakan daftar adjacency untuk memodelkan hubungan banyak-ke-banyak . Tidak ada yang hemat biaya cara memodelkan data, yang saya tahu, untuk memungkinkan Anda mendapatkan semua data yang Anda inginkan dalam satu panggilan. Namun, Anda telah mengatakan bahwa kecepatan adalah yang paling penting (tanpa memberikan persyaratan latensi), jadi saya akan mencoba memberi Anda gambaran tentang seberapa cepat Anda bisa mendapatkan data jika disimpan di DynamoDB.

Skema Anda akan menjadi seperti ini:

Actor {
    ActorId, <-- This is the application/database id, not the actor's actual ID
    Name,
    Age,
    Bio
}

Film {
    FilmId, <-- This is the application/database id for the film
    Title,
    Description,
    ReleaseDate
}

ActedIn {
    ActorId,
    FilmId
}

Untuk menunjukkan bahwa seorang aktor berakting dalam sebuah film, Anda hanya perlu melakukan satu penulisan (yang secara konsisten satu digit milidetik menggunakan DynamoDB menurut pengalaman saya) untuk menambahkan item ActedIn ke tabel Anda.

Untuk mendapatkan semua film untuk seorang aktor, Anda perlu melakukan kueri sekali untuk mendapatkan semua pemeran dalam hubungan, dan kemudian membaca batch untuk mendapatkan semua film. Latensi khas untuk kueri (dalam pengalaman saya) di bawah 10 md, tergantung pada kecepatan jaringan dan jumlah data yang dikirim melalui jaringan. Karena hubungan ActedIn adalah objek yang sangat kecil, saya pikir Anda dapat mengharapkan kasus rata-rata 5 ms untuk kueri, jika kueri Anda berasal dari sesuatu yang juga berjalan di pusat data AWS (EC2, Lambda, dll).

Mendapatkan satu item akan berada di bawah 5 ms, dan Anda dapat melakukannya secara paralel. Ada juga BatchGetItems API, tapi saya tidak punya statistik untuk Anda tentang itu.

Jadi, apakah ~10ms cukup cepat untuk Anda?

Jika tidak, Anda dapat menggunakan DAX , yang menambahkan lapisan caching ke DynamoDB dan menjanjikan latensi permintaan <1ms.

Apa cara yang tidak dapat dipertahankan dan tidak hemat biaya untuk melakukan ini dalam satu panggilan?

Untuk setiap hubungan ActedIn, simpan data Anda seperti ini:

ActedIn {
    ActorId,
    ActorName,
    ActorAge,
    ActorBio,
    FilmId,
    FilmTitle,
    FilmDescription,
    FilmReleaseDate
}

Anda hanya perlu membuat satu kueri untuk Aktor tertentu untuk mendapatkan semua detail film mereka, dan hanya satu kueri untuk mendapatkan semua detail Aktor untuk film tertentu. Jangan lakukan ini. Data yang digandakan berarti bahwa setiap kali Anda harus memperbarui detail untuk seorang Aktor, Anda perlu memperbaruinya untuk setiap Film yang mereka mainkan, dan juga untuk detail Film. Ini akan menjadi mimpi buruk operasional.

Saya tidak yakin; sepertinya NoSQL sangat buruk untuk ini.

Anda harus ingat bahwa NoSQL hadir dalam banyak variasi (NoSQL =Not Only SQL), dan bahkan jika satu solusi NoSQL tidak bekerja untuk Anda, Anda tidak boleh mengesampingkannya sepenuhnya. Jika Anda benar-benar membutuhkan ini dalam satu panggilan, Anda harus mempertimbangkan untuk menggunakan Basis data grafik (yang merupakan tipe lain dari database NoSQL).




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Node.js / Mongodb insert callback kembali tidak terdefinisi

  2. Mongodb Aggregation count array/set size

  3. Melewati nilai kotak centang ke database menggunakan JavaScript

  4. Gunakan LIKE/regex dengan variabel di mongoid

  5. Memperbarui Referensi Bersama Dengan Nilai Lain Luwak