MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Làm cách nào để triển khai lược đồ này trong MongoDB?

Đượ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:

  1. Đặt danh sách Campaign ID bên trong của mỗi User
  2. Đặt danh sách Users ID bên trong mỗi Campaign

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:

  1. Người dùng -> có danh sách chiến dịch._id
  2. Chiến dịch
  3. 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.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Tìm giá trị không chứa số trong SQL

  2. Làm cách nào để đảm bảo mục duy nhất trong một mảng dựa trên các trường cụ thể - mongoDB?

  3. MongoDB insertMany ()

  4. Cách MongoDB kích hoạt học máy

  5. sắp xếp theo độ dài chuỗi trong Mongodb / pymongo