Ở 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ệ, inventories
và inventory_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.
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
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