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

Cách hiệu quả để lưu trữ dữ liệu trong MongoDB:tài liệu nhúng so với tài liệu riêng lẻ

Sẽ tốt hơn nếu sử dụng cách tiếp cận đầu tiên (các tài liệu riêng lẻ) và sử dụng bộ sưu tập có giới hạn nếu có thể, vì bạn không muốn có bộ sưu tập đang phát triển nhanh chóng (mongoid sẽ có hỗ trợ cho các bộ sưu tập có giới hạn trong 2.2, sẽ ra mắt vào cuối tuần này. đoán).

Cách tiếp cận thứ hai (tài liệu nhúng), trước tiên bạn sẽ cần tìm nạp tài liệu gốc cho người dùng và sau đó duyệt qua mảng trong ứng dụng để tìm hoạt động liên quan đến bài đăng bạn đang tìm kiếm. Mongoid có thể làm cho nó trông giống như mọi thứ được thực hiện trong db do sự giống nhau về cú pháp trong việc tìm kiếm một tài liệu nhúng, nhưng nó thực sự lặp lại mảng.

Vì bạn đã có user_id, activity_id và activity_type trước khi thực hiện truy vấn và bạn sẽ không muốn toàn bộ danh sách các hoạt động của người dùng được truy xuất từ ​​db khi bạn đang tìm kiếm một hoạt động cụ thể, tôi sẽ thích trường hợp đầu tiên hơn. Sẽ có ít tính toán hơn (tìm kiếm) trong ứng dụng và sẽ có ít lưu lượng mạng hơn nhiều.

Với cách tiếp cận tài liệu riêng lẻ, sẽ thật tuyệt nếu bạn cũng tạo một chỉ mục duy nhất trên user_id, activity_id, activity_type. Nó sẽ giúp bạn chứa số lượng tài liệu. Bạn có thể có xác nhận tính duy nhất (truy vấn bổ sung), nhưng điều đó hầu như không cần thiết nếu bạn có chỉ mục duy nhất. Lợi ích duy nhất của việc xác thực sẽ là lỗi xác thực nếu có các bản sao, nhưng chỉ mục sẽ im lặng bỏ qua các mục trùng lặp trừ khi bạn tiếp tục ở chế độ an toàn.

Trong trường hợp bạn cũng muốn hoạt động của di tích lịch sử được duy trì, bạn có thể có cấu trúc như:

class SiteActivity
  include Mongoid::Document
  include Mongoid::Timestamps
  belongs_to :user
  belongs_to :activity, polymorphic: true

  index [:user_id, :activity_id, :activity_type], :background => true, :unique => true

  field :last_access_time, :type => Time
  # last_access_times just here for history, not used
  field :last_access_times, :type => Array, :default => []
end

activity = SiteActivity.find_or_initialize_by(:user_id => current_user.id,
               :activity_id => post.id, :activity_type => post.class)
time = Time.now.utc
activity.last_access_time = time
activity.last_access_times << time
activity.save


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB tìm Tài liệu trong đó tất cả các phần tử mảng bằng một số giá trị

  2. Chèn dữ liệu vào MongoDB - không lỗi, không chèn

  3. mongoDB:Trình điều khiển C # V2 Cách cập nhật mục trong bộ sưu tập lồng nhau

  4. Nhập tài liệu vào MongoDB từ một mảng tài liệu JSON

  5. Làm cách nào để đợi mục danh sách mongoose được đẩy?