Được rồi, tôi nghĩ bạn cần chia điều này thành các "giống" cơ bản.
Bạn có hai đối tượng kiểu "thực thể":
-
User
-
Campaign
Bạn có một đối tượng kiểu "ánh xạ":
-
UserCampaign
Bạn có một đối tượng kiểu "giao dịch":
-
Click
Bước 1:thực thể
Hãy bắt đầu với những cái đơn giản:User
&Campaign
. Đây thực sự là hai đối tượng riêng biệt, không cái nào thực sự phụ thuộc vào cái kia về sự tồn tại của nó. Cũng không có thứ bậc ngầm nào giữa hai điều này:Người dùng không thuộc về Chiến dịch, cũng như Chiến dịch không thuộc về Người dùng.
Khi bạn có hai đối tượng cấp cao nhất như thế này, chúng thường kiếm được bộ sưu tập của riêng mình. Vì vậy, bạn sẽ muốn có một User
bộ sưu tập và một Camapaigns
bộ sưu tập.
Bước 2:lập bản đồ
UserCampaign
hiện được sử dụng để biểu diễn ánh xạ N-to-M. Nói chung, khi bạn có một ánh xạ N-1, bạn có thể đặt N vào bên trong 1. Tuy nhiên, với ánh xạ N-to-M, bạn thường phải "chọn một bên".
Về lý thuyết, bạn có thể thực hiện một trong những điều sau:
- Đặt danh sách
Campaign ID
bên trong của mỗiUser
- Đặt danh sách
Users ID
bên trong mỗiCampaign
Cá nhân tôi, tôi sẽ làm # 1. Bạn có thể có nhiều người dùng hơn cho các chiến dịch và bạn có thể muốn đặt mảng ở nơi nó sẽ ngắn hơn.
Bước 3:giao dịch
Nhấp chuột thực sự là một con thú hoàn toàn khác. Theo thuật ngữ đối tượng, bạn có thể nghĩ như sau:Clicks
"thuộc về" một User
, Clicks
"thuộc về" một Campaign
. Vì vậy, về lý thuyết, bạn chỉ có thể lưu trữ các nhấp chuột là một phần của một trong hai đối tượng này. Thật dễ dàng để nghĩ rằng Số lần nhấp thuộc dưới Người dùng hoặc Chiến dịch.
Nhưng nếu bạn thực sự tìm hiểu sâu hơn thì sự đơn giản hóa trên thực sự là thiếu sót. Trong hệ thống của bạn, Clicks
thực sự là một đối tượng trung tâm. Trên thực tế, bạn thậm chí có thể nói rằng Người dùng &Chiến dịch thực sự chỉ "được kết hợp với" nhấp chuột.
Hãy xem các câu hỏi / truy vấn mà bạn đang hỏi. Tất cả những câu hỏi đó thực sự xoay quanh các nhấp chuột. Người dùng &Chiến dịch không phải là đối tượng trung tâm trong dữ liệu của bạn, Số nhấp chuột là.
Ngoài ra, Số lần nhấp sẽ là dữ liệu phong phú nhất trong hệ thống của bạn. Bạn sẽ có nhiều nhấp chuột hơn bất kỳ thứ gì khác.
Đây là trở ngại lớn nhất khi thiết kế một lược đồ cho dữ liệu như thế này. Đôi khi bạn cần loại bỏ các đối tượng "cha mẹ" khi chúng không phải là thứ quan trọng nhất. Hãy tưởng tượng xây dựng một hệ thống thương mại điện tử đơn giản. Rõ ràng là orders
sẽ "thuộc về" users
, nhưng orders
là trung tâm của hệ thống đến mức nó sẽ là một đối tượng "cấp cao nhất".
Kết thúc nó
Có thể bạn sẽ muốn ba bộ sưu tập:
- Người dùng -> có danh sách chiến dịch._id
- Chiến dịch
- Các nhấp chuột -> chứa user._id, campaign._id
Điều này sẽ đáp ứng tất cả các nhu cầu truy vấn của bạn:
Xem thông tin từ mỗi lần nhấp như IP, Người giới thiệu, Hệ điều hành, v.v.
db.clicks.find()
Xem tần suất nhấp chuột đến từ X IP, X Referer, X OS
db.clicks.group()
hoặc chạy Map-Reduce.
Liên kết mỗi nhấp chuột với Người dùng và Chiến dịch
db.clicks.find({user_id : blah})
Cũng có thể đẩy ID nhấp chuột vào cả người dùng và chiến dịch (nếu điều đó hợp lý).
Xin lưu ý rằng nếu bạn có rất nhiều và rất nhiều nhấp chuột, bạn sẽ thực sự phải phân tích các truy vấn mà bạn chạy nhiều nhất. Bạn không thể lập chỉ mục trên mọi trường, vì vậy, bạn thường muốn chạy Map-Reduce để "tổng hợp" dữ liệu cho các truy vấn này.