He creado un buen sistema de sitio web que atiende las necesidades de un pequeño nicho de mercado. He estado vendiendo estos sitios web durante el último año mediante la implementación de copias del software usando Capistrano en mi servidor web.mejor estrategia de base de datos para un sitio web basado en el cliente (Ruby on Rails)
Se me ocurre que la única diferencia en estos sitios web es la base de datos, el archivo CSS y un pequeño conjunto de imágenes utilizadas para el diseño gráfico del cliente individual.
Todo lo demás es exactamente igual, o debería ser ... Ahora que tengo alrededor de 20 de estos sitios implementados, es una molestia mantenerlos actualizados con el mismo código. Y este problema solo empeorará.
Estoy pensando que debería refactorizar este sistema, de modo que pueda usar un conjunto de código de ruby desplegado, seleccionando dinámicamente la base de datos correcta, etc., por la URL de la solicitud entrante.
Parece que hay dos maneras de manejar la base de datos:
- el uso de múltiples bases de datos, uno para cada cliente
- utilizando una base de datos, con un campo client_id en cada mesa, y un cliente extra' 'tabla
El enfoque de la base de datos múltiple sería el más simple para mí en este momento, ya que no tendría que refactorizar cada modelo en mi aplicación para agregar el campo client_id a todas las operaciones CRUD.
Sin embargo, sería una molestia tener que ejecutar 'rake db: migrate' para decenas o cientos de bases de datos diferentes, cada vez que quiera migrar la (s) base (s) de datos. Obviamente, esto podría hacerse mediante un script, pero no huele muy bien.
Por otro lado, cada cliente tendrá 20K-50K elementos en una tabla de 'artículos'. Me preocupa la velocidad de las búsquedas de texto completo cuando la tabla de elementos tiene medio millón o millones de elementos. Incluso con un índice en el campo client_id, sospecho que las búsquedas serían más rápidas si los artículos se separaran en diferentes bases de datos de clientes.
Si alguien tiene una opinión informada sobre la mejor manera de abordar este problema, me gustaría mucho escucharlo. Gracias de antemano ...
- John
Lo enrutaría de manera diferente, pero así soy yo. Me gusta, ": user_id /: controller /: action /: id" en routes.rb; de esta manera, siempre tendrá la ID del cliente en las direcciones URL sin algo que el cliente pueda eliminar (como el bit "cliente ="). –