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

Bagaimana saya harus mengimplementasikan skema ini di MongoDB?

Oke, saya rasa Anda perlu membaginya menjadi "varietas" dasar.

Anda memiliki dua objek bergaya "entitas":

  • User
  • Campaign

Anda memiliki satu objek bergaya "pemetaan":

  • UserCampaign

Anda memiliki satu objek bergaya "transaksional":

  • Click

Langkah 1:entitas

Mari kita mulai dengan yang mudah:User &Campaign . Ini benar-benar dua objek yang terpisah, tidak ada yang benar-benar bergantung pada yang lain untuk keberadaannya. Juga tidak ada hierarki implisit di antara keduanya:Pengguna bukan milik Kampanye, kampanye juga bukan milik Pengguna.

Ketika Anda memiliki dua objek tingkat atas seperti ini, mereka biasanya mendapatkan koleksinya sendiri. Jadi, Anda akan menginginkan Users koleksi dan Campaign koleksi.

Langkah 2:pemetaan

UserCampaign saat ini digunakan untuk mewakili pemetaan N-ke-M. Sekarang, secara umum, ketika Anda memiliki pemetaan N-ke-1, Anda dapat menempatkan N di dalam 1. Namun, dengan pemetaan N-ke-M, Anda biasanya harus "memilih sisi".

Secara teori, Anda dapat melakukan salah satu hal berikut:

  1. Masukkan daftar Campaign ID s di dalam setiap User
  2. Masukkan daftar Users ID s di dalam setiap Campaign

Secara pribadi, saya akan melakukan #1. Anda mungkin memiliki lebih banyak pengguna yang berkampanye, dan Anda mungkin ingin menempatkan larik di tempat yang lebih pendek.

Langkah 3:transaksional

Klik benar-benar binatang yang sama sekali berbeda. Dalam istilah objek, Anda dapat memikirkan hal berikut:Click "milik" seorang User , Click "milik" sebuah Campaign . Jadi, secara teori, Anda bisa saja menyimpan klik yang merupakan bagian dari salah satu objek ini. Sangat mudah untuk berpikir bahwa Klik termasuk di bawah Pengguna atau Kampanye.

Tetapi jika Anda benar-benar menggali lebih dalam, penyederhanaan di atas benar-benar cacat. Di sistem Anda, Click benar-benar objek sentral. Bahkan, Anda bahkan mungkin dapat mengatakan bahwa Pengguna &Kampanye benar-benar hanya "dikaitkan dengan" klik.

Lihatlah pertanyaan / pertanyaan yang Anda ajukan. Semua pertanyaan itu sebenarnya berpusat di sekitar klik. Pengguna &Kampanye bukanlah objek utama dalam data Anda, melainkan Klik.

Selain itu, Klik akan menjadi data paling banyak di sistem Anda. Anda akan mendapatkan lebih banyak klik daripada yang lainnya.

Ini adalah halangan terbesar ketika merancang skema untuk data seperti ini. Terkadang Anda perlu mendorong objek "induk" saat itu bukan hal yang paling penting. Bayangkan membangun sistem e-commerce sederhana. Jelas bahwa orders akan menjadi "milik" users , tapi orders sangat penting bagi sistem sehingga akan menjadi objek "tingkat atas".

Menyelesaikannya

Anda mungkin menginginkan tiga koleksi:

  1. Pengguna -> memiliki daftar kampanye._id
  2. Kampanye
  3. Klik -> berisi user._id, campaign._id

Ini akan memenuhi semua kebutuhan kueri Anda:

Lihat informasi dari setiap klik seperti IP, Referer, OS, dll

db.clicks.find()

Lihat seberapa sering klik datang dari X IP, X Referer, X OS

db.clicks.group() atau jalankan Pengurangan Peta.

Kaitkan setiap klik dengan Pengguna dan Kampanye

db.clicks.find({user_id : blah}) Anda juga dapat memasukkan ID klik ke pengguna dan kampanye (jika itu masuk akal).

Harap perhatikan bahwa jika Anda memiliki banyak klik, Anda benar-benar harus menganalisis kueri yang paling sering Anda jalankan. Anda tidak dapat mengindeks di setiap bidang, jadi Anda sering ingin menjalankan Map-Reduces untuk "menggulung" data untuk kueri ini.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB Node menemukan cara untuk menangani tidak ada hasil?

  2. MongoDB:keluaran 'id' bukan '_id'

  3. Luwak:CastError:Cast ke ObjectId gagal untuk nilai [objek Obyek] di jalur _id

  4. Bagaimana Memulai Dengan Otomatisasi Basis Data

  5. mongodb ditemukan oleh beberapa item array