¿Cuál de CouchDB o MongoDB se adapta a mis necesidades?

Donde trabajo, utilizamos Ruby on Rails para crear aplicaciones de backend y frontend. Por lo general, estas aplicaciones interactúan con la misma base de datos MySQL. Funciona muy bien para la mayoría de nuestros datos, pero tenemos una situación que me gustaría mover a un entorno NoSQL.

Tenemos clientes, y nuestros clientes tienen lo que llamamos "inventarios", uno o más de ellos. Un inventario puede tener muchos miles de artículos. Esto se hace actualmente a través de dos tablas de bases de datos relacionales,inventories yinventory_items.

Los problemas comienzan cuando dos inventarios diferentes tienen parámetros diferentes:

# 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
}

Como obviamente no podemos usarbrand ostar_rating como el nombre de la columna eninventory_items, nuestra solución hasta ahora ha sido utilizar nombres de columna genéricos comotext_a, text_b, float_a, int_a, etc., e introduzca una tercera tabla,inventory_schemas. Las tablas ahora se ven así:

# 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
}

Esto ha funcionado bien ... hasta cierto punto. Es torpe, no es intuitivo y carece de escalabilidad. Tenemos que dedicar recursos para configurar esquemas de inventario. Usar tablas separadas no es una opción.

Ingrese NoSQL. Con él, podríamos dejar que cada elemento tenga sus propios parámetros y aún así almacenarlos juntos. De la investigación que he hecho, ciertamente parece una gran alternativa para esta situación.

Específicamente, he mirado CouchDB y MongoDB. Ambos se ven geniales. Sin embargo, hay algunas otras partes y piezas que necesitamos poder hacer con nuestro inventario:

Necesitamos poder seleccionar artículos de solo uno (o varios) inventarios.Necesitamos poder filtrar los artículos en función de sus parámetros (por ejemplo, obtener todos los artículos del inventario 2 donde el tipo es 'hotel').Necesitamos poder agrupar los artículos según los parámetros (por ejemplo, obtener el precio más bajo de los artículos del inventario 1 donde la marca es 'Samsung').Necesitamos (potencialmente) poder recuperar miles de artículos a la vez.Necesitamos poder acceder a los datos desde múltiples aplicaciones; tanto backend (para procesar datos) como frontend (para mostrar datos).Se desea una inserción masiva rápida, aunque no es necesaria.

Según la estructura y los requisitos, ¿CouchDB o MongoDB son adecuados para nosotros? Si es así, ¿cuál será la mejor opción?

Gracias por leer y gracias de antemano por las respuestas.

EDITAR: Una de las razones por las que me gusta CouchDB es que sería posible para nosotros en la aplicación frontend solicitar datos a través de JavaScript directamente desde el servidor después de cargar la página, y mostrar los resultados sin tener que usar ningún código de fondo. Esto llevaría a una mejor carga de la página y menos tensión del servidor, ya que la obtención / procesamiento de los datos se realizaría en el lado del cliente.

Respuestas a la pregunta(1)

Su respuesta a la pregunta