8 votes

Plusieurs tables de base de données dans un seul modèle AR dans Rails 3

On m'a demandé de créer une sorte de service de rapport (journalisation). L'employé a installé localement une application web (juste un site web dynamique, écrit en PHP) dans de nombreuses entreprises. Cette application web est une sorte d'enquête. Toutes les données sont sauvegardées dans la base de données locale, mais maintenant l'exigence est que ces données (résultat de l'enquête) seront également envoyées au serveur central après chaque soumission du formulaire.

Il existe quatre types d'enquêtes. L'organisation est telle qu'il y a de nombreux projets et que chaque projet ne peut avoir qu'une seule enquête de chaque type (STI ici ?) et l'enquête appartient à un seul projet. Chaque enquête recevra un rapport de l'application locale, qui aura donc plusieurs rapports. L'application Rails 3 qui enregistre ces rapports doit imiter cette logique. La première question est la suivante : cette structure AR a-t-elle un sens pour vous ?

  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 deuxième question concerne le fait d'avoir plusieurs tables pour un modèle AR. Si toutes les données sont stockées dans reports La table deviendra très vite énorme, et l'interrogation efficace des rapports qui appartiennent à une enquête spécifique pourrait poser problème après un certain temps. Peut-être serait-il préférable d'avoir des tableaux séparés pour chaque enquête ? Comme reports_<survey_id> . Est-ce possible ?

De plus, je suis en quelque sorte obligé d'utiliser MySQL, mais s'il existe une autre solution bien meilleure pour cela, je pourrais essayer de la faire passer.

Si vous êtes toujours là, merci de lire ceci :)

5voto

coreyward Points 26109

Mettez un index sur chacune de vos clés étrangères (par exemple, Reports.survey_id) et respirez un peu. Vous vous inquiétez beaucoup trop des performances en ce moment. Vous aurez besoin d'au moins moins Des millions d'enregistrements dans votre table de rapports avant que vous ne rencontriez des problèmes de performance avec MySQL.

5voto

Anton Points 1137

La deuxième question concerne le fait d'avoir plusieurs tables pour un modèle AR. Si toutes les données sont stockées dans la table des rapports, la table deviendra très vite énorme, et l'interrogation efficace des rapports qui appartiennent à une enquête spécifique pourrait poser problème après un certain temps. Peut-être serait-il préférable d'avoir des tables distinctes pour chaque enquête ? Comme reports_. Est-ce possible ?

Oui, c'est possible.

Vous pouvez le faire de cette façon :

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

Report.table_name_suffix = 'foo'

UPDATE


# 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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X