2010-04-09 13 views
8

Estoy aprendiendo Rails, y el objetivo de mis experimentos es realizar algo similar a Zoho Creator, Flexlist o Mytaskhelper, es decir, una aplicación donde el usuario puede crear su propio esquema de base de datos y vistas. ¿Cuál es la mejor estrategia para lograr esto?¿Cómo crear una base de datos personalizable del usuario (como el creador de Zoho) en Rails?

Vi algo sobre Entity-Attribute-Value pero no estoy seguro de si es la mejor estrategia o si hay algún tipo de soporte en Rails para ello.

Si hubiera algún tutorial en Rails sobre un proyecto similar, sería genial.

Probablemente no sea la estrella más fácil para aprender un nuevo lenguaje y marco, pero sería algo que realmente planeo hacer desde hace mucho tiempo.

Respuesta

9

Su mejor apuesta será MongoDB. Es fácil de aprender (porque el lenguaje de consulta es JavaScript) y proporciona un almacén de datos sin esquema. Crearía un documento para cada formulario que define la estructura del formulario. Luego, cada vez que un usuario envía los datos, puede poner los datos en una estructura genérica y almacenarlos en una colección basada en el nombre del formulario. En MongoDB, las colecciones son como tablas, pero puedes crearlas sobre la marcha. También puede crear índices sobre la marcha para acelerar las búsquedas.

El problema que está tratando de resolver es uno de los principales casos de uso de bases de datos orientadas a documentos que MongoDB. Hay muchas otras bases de datos orientadas a documentos, pero en mi opinión MongoDB tiene la mejor API en este momento.

Dale una lectura al MongoDB Ruby tutorial y estoy seguro de que querrás probarlo.

NO use una base de datos relacional para hacer esto. La creación de tablas sobre la marcha será miserable y constituye un peligro para la seguridad, no solo para su sistema, sino también para los datos de sus usuarios. Puede evitar crear tablas sobre la marcha creando un esquema complejo que rastree las estructuras de formulario y cada tipo de campo requerirá su propia tabla. Rails hace que esto sea menos doloroso con las asociaciones polimórficas, pero definitivamente no es bonito.

0

Debe ser posible generar tablas de base de datos enviando sentencias DDL directamente al servidor o dinámicamente generando una migración. Luego puede generar los modelos ActiveRecord correspondientes usando Class.new (ActiveRecord :: Base) do ... end. En principio, esto debería funcionar, pero debe hacerse con cuidado. Pero definitivamente este no es un trabajo para principiantes.

Una segunda solución podría ser usar MongoMapper y MongoDB. Mi idea es usar una colección para almacenar las filas de su tabla y como MongoDB es un esquema menos, simplemente puede agregar atributos.

0

Usar una tienda de documentos como mongodb o couchdb sería la mejor manera de avanzar, ya que están libres de esquemas.

0

El uso de EntryAttributeValue le permite almacenar cualquier dato de esquema en una cantidad determinada de tablas, sin embargo, las implicaciones de rendimiento y problemas de mantenimiento que esto crea pueden no valer la pena.

Alternativamente, podría almacenar sus datos en XML y generar un esquema XML para validar.

Todas las soluciones "genéricas" tendrán problemas con las claves externas u otras restricciones, a menos que realice toda esa validación en la memoria antes del almacenamiento.

Cuestiones relacionadas