2011-05-12 9 views
8

Me pidieron que hiciera algún tipo de servicio de informes (registro). El empleado tiene una aplicación web instalada localmente (solo un sitio web dinámico, escrito en PHP) en muchas compañías. Esta aplicación web es un tipo de encuesta. Todos los datos se guardan en la base de datos local, pero ahora el requisito es que estos datos (resultado de la encuesta) también se envíen al servidor central después de enviar cada formulario.Múltiples tablas de bases de datos dentro de un modelo AR en Rails 3

Existen cuatro tipos de encuestas. Lo han organizado de esta manera, que hay muchos proyectos, y cada proyecto puede tener solo una encuesta de cada tipo (¿STI aquí?) Y la encuesta pertenece a un proyecto. Cada encuesta recibirá un informe de la aplicación local, por lo que tendrá muchos informes. La aplicación Rails 3 que registra estos informes debe imitar de algún modo esta lógica. La primera pregunta es: ¿esta estructura de RA tiene sentido para usted?

Project-1--------1-Survey-1-------*-Report 

    Project 
    has_one :survey 
    has_many :reports, :through => :survey 

    Survey 
    belongs_to :project 
    has_many :reports 

    Report 
    belongs_to :survey 

La segunda pregunta es acerca de tener varias tablas para un modelo de AR. Si todos los datos se almacenan en la tabla reports, la tabla aumentará enormemente rápidamente, y la consulta eficiente de informes que pertenecen a una encuesta específica podría ser un problema después de un tiempo. ¿Tal vez sería mejor tener tablas separadas para cada encuesta? Me gusta reports_<survey_id>. es posible?

Además, de alguna manera estoy obligado a usar MySQL, pero si hay otra solución mucho mejor para esto, podría intentar impulsarla.

Si usted todavía está aquí, gracias por leer esto :)

Respuesta

4

La segunda pregunta es acerca de tener varias tablas para un modelo de AR. Si todos los datos se almacenan en la tabla de informes, la tabla se volverá enorme rápidamente, y la consulta eficiente de informes que pertenecen a una encuesta específica podría ser un problema después de un tiempo. ¿Tal vez sería mejor tener tablas separadas para cada encuesta? Me gusta reports_. es posible?

Sí, es posible.

Usted puede hacerlo de esta manera:

class Report < AR::Base 
    table_name_suffix = '' 
end 

Report.table_name_suffix = 'foo' 

ACTUALIZACIÓN


# simple example of sharding model 

class Survey < AR::Base 
    has_many :reports 

    def shard_reports 
    Report.table_name_suffix = "_survey_#{self.id}" 
    returning(reports){ Report.table_name_suffix = "" } 
    end 

end 

Survey.first.reports_shard 
+0

Gracias, parece fácil. Espero que esto no cause ningún problema. – Ernest

+0

Los problemas serán;) Porque, debe controlar esto manualmente. Y cree una nueva tabla de informes cuando cree una encuesta – Anton

+0

@Anton What? Esto suena como un desastre. Ver http://stackoverflow.com/questions/44145/database-sharding-and-rails – coreyward

5

Deja un índice en cada una de sus claves externas (por ejemplo Reports.survey_id) y tomar un respiro. Te estás preocupando demasiado por el rendimiento en este momento. Necesitará en menos millones de registros en su tabla Informes antes de que vea ningún problema de rendimiento de MySQL.

+0

Sí, tal vez yo estoy preocupando demasiado. Vea mi último comentario a la respuesta de Anton. Gracias de nuevo por sus consejos. – Ernest

Cuestiones relacionadas