2010-06-09 22 views
16

Ở nơi tôi làm việc, chúng tôi sử dụng Ruby on Rails để tạo cả ứng dụng phụ trợ và giao diện người dùng. Thông thường, các ứng dụng này tương tác với cùng một cơ sở dữ liệu MySQL. Nó hoạt động tốt cho phần lớn dữ liệu của chúng tôi, nhưng chúng tôi có một tình huống mà tôi muốn chuyển sang môi trường NoSQL.CouchDB hoặc MongoDB nào phù hợp với nhu cầu của tôi?

Chúng tôi có khách hàng và khách hàng của chúng tôi có những gì chúng tôi gọi là "hàng tồn kho" - một hoặc nhiều trong số đó. Khoảng không quảng cáo có thể có hàng nghìn mục. Điều này hiện được thực hiện thông qua hai bảng cơ sở dữ liệu quan hệ, inventoriesinventory_items.

Những vấn đề bắt đầu khi hai hàng tồn kho khác nhau có những thông số khác nhau:

# Inventory item from inventory 1, televisions 
{ 
    inventory_id: 1 
    sku: 12345 
    name: Samsung LCD 40 inches 
    model: 582903-4 
    brand: Samsung 
    screen_size: 40 
    type: LCD 
    price: 999.95 
} 

# Inventory item from inventory 2, accomodation 
{ 
    inventory_id: 2 
    sku: 48cab23fa 
    name: New York Hilton 
    accomodation_type: hotel 
    star_rating: 5 
    price_per_night: 395 
} 

Kể từ khi chúng tôi rõ ràng là không thể sử dụng brand hay star_rating như tên cột trong inventory_items, giải pháp của chúng tôi cho đến nay đã được sử dụng tên cột chung chẳng hạn như text_a, text_b, float_a, int_a, v.v. và giới thiệu bảng thứ ba, inventory_schemas. Các bảng giờ trông giống như sau:

# Inventory schema for inventory 1, televisions 
{ 
    inventory_id: 1 
    int_a: sku 
    text_a: name 
    text_b: model 
    text_c: brand 
    int_b: screen_size 
    text_d: type 
    float_a: price 
} 

# Inventory item from inventory 1, televisions 
{ 
    inventory_id: 1 
    int_a: 12345 
    text_a: Samsung LCD 40 inches 
    text_b: 582903-4 
    text_c: Samsung 
    int_a: 40 
    text_d: LCD 
    float_a: 999.95 
} 

Điều này đã hoạt động tốt ... đến một điểm. It's clunky, nó unintuitive và nó thiếu khả năng mở rộng. Chúng ta phải dành tài nguyên để thiết lập lược đồ khoảng không quảng cáo. Sử dụng các bảng riêng biệt không phải là một tùy chọn.

Nhập NoSQL. Với nó, chúng tôi có thể để cho mỗi và mọi mục có thông số riêng của họ và vẫn lưu trữ chúng lại với nhau. Từ nghiên cứu tôi đã làm, nó chắc chắn có vẻ như là một sự thay đổi lớn cho tình huống này.

Cụ thể, tôi đã xem xét CouchDB và MongoDB. Cả hai đều trông tuyệt vời. Tuy nhiên, có một vài bit và phần khác mà chúng tôi cần để có thể thực hiện với khoảng không quảng cáo của chúng tôi:

  • Chúng tôi cần có thể chọn các mặt hàng từ một (hoặc một số) hàng tồn kho.
  • Chúng tôi cần có thể lọc các mục dựa trên các thông số của nó (ví dụ: lấy tất cả các mục từ khoảng không quảng cáo 2, trong đó loại là 'khách sạn').
  • Chúng tôi cần có thể nhóm các mặt hàng dựa trên các thông số (ví dụ: có được mức giá thấp nhất từ ​​các mặt hàng trong khoảng không quảng cáo 1 nơi thương hiệu là 'Samsung').
  • Chúng tôi cần (có khả năng) có thể truy xuất hàng nghìn mục cùng một lúc.
  • Chúng tôi cần có thể truy cập dữ liệu từ nhiều ứng dụng; cả phụ trợ (để xử lý dữ liệu) và giao diện người dùng (để hiển thị dữ liệu).
  • Chèn hàng loạt nhanh chóng là mong muốn, mặc dù không bắt buộc.

Dựa trên cấu trúc và các yêu cầu, hoặc là CouchDB hoặc MongoDB phù hợp với chúng tôi? Nếu vậy, cái nào sẽ phù hợp nhất?

Cảm ơn bạn đã đọc và cảm ơn trước vì câu trả lời. EDIT: Một trong những lý do tôi thích CouchDB là có thể cho chúng tôi trong ứng dụng giao diện người dùng yêu cầu dữ liệu qua JavaScript trực tiếp từ máy chủ sau khi tải trang và hiển thị kết quả mà không phải sử dụng bất kỳ mã phụ trợ nào . Điều này sẽ dẫn đến tải trang tốt hơn và căng thẳng máy chủ ít hơn, vì việc tìm nạp/xử lý dữ liệu sẽ được thực hiện phía máy khách.

+0

Một điều nữa bạn có thể nên cân nhắc là mức độ toàn vẹn dữ liệu bạn cần - tức là bạn có cần một kho dữ liệu tương thích với axit hay không. – nos

+0

Cảm ơn nhận xét của bạn. Liên quan đến tính toàn vẹn, nó không phải là một ưu tiên lớn. Chúng tôi nhập khoảng không quảng cáo vào một lần thay đổi lớn, sau đó chúng tôi hiếm khi thao tác nó - chỉ xem nó. Như vậy, tôi thậm chí không nghĩ rằng giao dịch là cần thiết. – vonconrad

Trả lời

17

Tôi làm việc trên MongoDB, vì vậy bạn nên thực hiện điều này với một hạt muối, nhưng điều này có vẻ rất phù hợp với Mongo.

  • Chúng tôi cần có thể chọn các mục từ chỉ một (hoặc một số) khoảng không quảng cáo.

Thật dễ dàng để truy vấn đặc biệt trên bất kỳ trường nào.

  • Chúng ta cần phải có khả năng lọc các mục dựa trên các thông số của nó (ví dụ. Nhận được tất cả các mục từ hàng tồn kho 2 trong đó type là 'khách sạn').

Truy vấn cho điều này sẽ là: {"inventory_id" : 2, "type" : "hotel"}.

  • Chúng ta cần để có thể mục nhóm dựa trên các thông số (ví dụ. Có được giá thấp nhất từ ​​các mặt hàng trong kho 1 nơi thương hiệu là 'Samsung').

Một lần nữa, siêu dễ dàng: db.items.find({"brand" : "Samsung"}).sort({"price" : 1})

  • Chúng ta cần phải (khả năng) có thể lấy hàng ngàn mặt hàng tại một thời điểm.

Không thành vấn đề.

  • Chèn nhanh hàng loạt là mong muốn, mặc dù không bắt buộc.

MongoDB có chèn hàng loạt nhanh hơn nhiều so với CouchDB.

Ngoài ra, có một giao diện REST cho MongoDB: http://github.com/kchodorow/sleepy.mongoose

Bạn có thể muốn đọc http://chemeo.com/doc/technology, người giải quyết vấn đề tìm kiếm tài sản tùy ý với MongoDB.

+0

Cảm ơn câu trả lời của bạn! Một câu hỏi tiếp theo: Về nhóm, điều gì sẽ xảy ra nếu tôi muốn tìm hiểu mức giá thấp nhất cho Samsung cũng như Sony trong một truy vấn? Điều gì sẽ xảy ra nếu có 100 hoặc 1000 thương hiệu? Trong SQL tôi có thể sử dụng 'SELECT MIN (giá) TỪ bảng GROUP BY thương hiệu;' - là một cái gì đó tương tự có thể cho MongoDB? – vonconrad

+2

Có, Mongo có chức năng nhóm tương đương với GROUP BY, xem http://www.mongodb.org/display/DOCS/Aregregation – kristina

Các vấn đề liên quan