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

Banyak ke banyak hubungan dengan MongoDB dalam skala besar

Ini adalah pertanyaan bagus yang mengilustrasikan masalah dengan overemebedding dan bagaimana mengatasinya.

Contoh:Sukai pos

Mari kita tetap pada contoh pengguna menyukai posting, yang merupakan contoh sederhana. Hubungan lainnya harus ditangani sesuai dengan itu.

Anda benar sekali bahwa dengan menyimpan suka di dalam kiriman cepat atau lambat akan menimbulkan masalah bahwa kiriman yang sangat populer akan mencapai batas ukuran.

Jadi Anda kembali dengan benar untuk membuat post_likes koleksi. Mengapa saya sebut ini benar? Karena ini sesuai dengan kasus penggunaan dan persyaratan fungsional dan non-fungsional Anda!

  • Ini berskala tanpa batas (well, ada batas teoretisnya, tapi sangat besar)
  • Mudah dipelihara (buat indeks unik di atas post_id dan liked_user_id ) dan gunakan (baik pengguna dan postingan diketahui, jadi menambahkan suka adalah sisipan sederhana atau lebih tepatnya upsert)
  • Anda dapat dengan mudah mengetahui pengguna mana yang menyukai kiriman mana dan kiriman mana yang disukai oleh pengguna mana

Namun saya akan sedikit memperluas koleksi untuk mencegah kueri yang tidak diperlukan untuk kasus penggunaan tertentu yang sering terjadi.

Mari kita asumsikan untuk saat ini bahwa judul posting dan nama pengguna tidak dapat diubah. Dalam hal ini, model data berikut mungkin lebih masuk akal

{
  _id: new ObjectId(),
  "post_id": someValue,
  "post_title": "Cool thing",
  "liked_user_id": someUserId,
  "user_name": "JoeCool"
}

Sekarang mari kita asumsikan Anda ingin menampilkan nama pengguna dari semua pengguna yang menyukai sebuah postingan. Dengan model di atas, itu akan menjadi kueri tunggal yang agak cepat:

db.post_likes.find(
  {"postId":someValue},
  {_id:0,user_name:1}
)

Dengan hanya ID yang disimpan, tugas yang agak biasa ini akan membutuhkan setidaknya dua kueri dan - mengingat batasan bahwa mungkin ada jumlah suka yang tak terbatas untuk sebuah pos - berpotensi besar konsumsi memori (Anda harus menyimpan ID pengguna di RAM).

Memang, ini menyebabkan beberapa redundansi, tetapi bahkan ketika jutaan orang menyukai sebuah pos, kita hanya membicarakan beberapa megabita ruang disk yang relatif murah (dan mudah diukur) sambil mendapatkan banyak kinerja dalam hal pengalaman pengguna.

Sekarang inilah masalahnya:Bahkan jika nama pengguna dan judul posting dapat berubah, Anda hanya perlu melakukan beberapa pembaruan:

db.post_likes.update(
  {"post_id":someId},
  { $set:{ "post_title":newTitle} },
  { multi: true}
)

Anda memperdagangkan bahwa perlu beberapa saat untuk melakukan beberapa hal yang agak langka seperti mengubah nama pengguna atau posting untuk kecepatan ekstrem untuk kasus penggunaan yang sangat sering terjadi.

Intinya

Perlu diingat bahwa MongoDB adalah database berorientasi dokumen. Jadi, dokumentasikan peristiwa yang Anda minati dengan nilai yang Anda perlukan untuk kueri di masa mendatang dan modelkan data Anda sesuai dengan itu.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Node.js gagal terhubung ke MongoDB

  2. Masukkan array objek ke MongoDB

  3. MongoDB - Jatuhkan Basis Data

  4. MongoDB $setIntersection

  5. Gandakan koleksi mongodb