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:
- Masukkan daftar
Campaign ID
s di dalam setiapUser
- Masukkan daftar
Users ID
s di dalam setiapCampaign
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:
- Pengguna -> memiliki daftar kampanye._id
- Kampanye
- 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.