2010-11-19 2 views
6

Thực tiễn phổ biến trong MongoDB là sử dụng các tên khóa ngắn để tiết kiệm không gian. Ví dụ: người ta có thể muốn sử dụng "fn" thay vì "first_name"Bí danh trường với Mongoid và Rails

Tuy nhiên, trong ứng dụng của bạn, bạn bị vặn nếu bạn sử dụng "fn" trên khắp nơi. Nó quá xấu xí. Đối với Rails cụ thể, có cách nào dễ dàng để chỉ định một bí danh khi khai báo một trường trong Mongoid không?

Ngoài ra, có ai biết về bất kỳ dự án mẫu mã nguồn mở nào sử dụng Mongoid không?

Cảm ơn!

Trả lời

3

Tôi chưa bao giờ thấy tên khóa ngắn trong bất kỳ dự án MongoDB nào, vì vậy tôi sẽ không nói đó là thực tiễn phổ biến. Tôi không nghĩ rằng bạn sẽ thấy một cải thiện tốc độ đáng chú ý và nó sẽ phức tạp mã của bạn không cần thiết. Tên mô tả là tốt quá lâu họ không phải là mô tả rằng nó sẽ đưa bạn mãi mãi để gõ.

Có rất nhiều dự án mã nguồn mở MongoDB. Chỉ cần thực hiện tìm kiếm trên github.

- chỉnh sửa bên dưới -

Đây là câu trả lời khá ý kiến. Ghi đè lên các phương thức xử lý (https://github.com/mongoid/mongoid/blob/master/lib/mongoid/attributes/processing.rb) như được mô tả trong các câu trả lời khác là phù hợp hơn trong kịch bản mà bạn PHẢI có các tên trường nhỏ.

+5

Đó không phải là vấn đề tốc độ, đó là vấn đề về không gian. Có một sự khác biệt lớn giữa việc lưu trữ "first_name" và "fn" một tỷ lần (~ 10GB so với ~ 2GB). Nếu bạn đang chạy trên phần cứng hàng hóa, không gian là giá rẻ, nhưng nếu bạn đang chạy trên phần cứng cấp máy chủ, không gian là tốn kém. Xem: http://blog.boxedice.com/2010/10/23/on-shortened-field-names-in-mongodb/ – Intelekshual

+0

Lần duy nhất tôi thấy tên trường rút gọn là cần thiết khi: 1) Các giá trị nhỏ, 2) Tập dữ liệu rất lớn, 3) Sơ đồ rất lỏng lẻo (các trường adhoc). Với 3 trường hợp đó, tôi đồng ý rằng ghi đè lên các phương thức xử lý có ý nghĩa (như được trả lời dưới đây). Thậm chí sau đó bạn sẽ phải ghi nhớ nó khi truy vấn, vì vậy bạn đang tạo ra một mã phức tạp hơn một chút. Ví dụ, nếu tôi có một tập dữ liệu thực sự lớn, các giá trị nhỏ, nhưng lược đồ của tôi hầu như không bao giờ thay đổi (như số liệu thống kê theo dõi) thì tôi có thể chọn postgresql thay vì mongodb. –

+0

Khá chắc chắn những người ở 10Gen (công ty đằng sau MongoDB) không đồng ý [1] với ý kiến ​​của Dave Rapin. Không chỉ, như @Intelekshual đề cập, bạn có thể nhận ra tiết kiệm không gian đĩa đáng kể, nhưng Mongo cần phải lưu trữ các bộ làm việc và các chỉ mục của bạn trong bộ nhớ. Tài liệu nhỏ hơn có nghĩa là bạn có thể lưu trữ nhiều hơn trong bộ nhớ, chưa kể hiệu suất làm tăng mã ứng dụng của bạn bằng cách không phải xử lý các tài liệu mong muốn hơn bloo [1]: http://docs.mongodb.org/manual/faq/developers/# how-do-i-optimization-storage-use-for-small-documents – xentek

0

Điều gì đó như thế này sẽ hoạt động trong tệp lớp học của bạn. (Nó chưa được thử nghiệm trong mọi trường hợp, chỉ cần đi qua một băm vào tạo hoặc cập nhật.)

field :fn, :type => String 

    alias :first_name :fn 
    alias :filtered_process :process 

    def process(attrs = nil) 
    attrs[:fn] = attrs[:first_name] unless attrs.nil? 
    filtered_process(attrs) 
    end 
+0

Mongoid 3 đã được xây dựng để hỗ trợ cho việc đánh dấu trường, vì vậy bạn không phải sử dụng phương thức alias-cache-destorying của ruby. – xentek