Несколько таблиц базы данных в одной модели AR в Rails 3 - PullRequest
8 голосов
/ 12 мая 2011

Меня попросили сделать какую-то службу отчетов (регистрации). Сотрудник установил локально установленное веб-приложение (просто динамический веб-сайт, написанный на PHP) во многих компаниях. Это веб-приложение является своего рода опросом. Все данные сохраняются в локальной базе данных, но теперь требуется, чтобы эти данные (результат опроса) также отправлялись на центральный сервер после каждой отправки формы.

Существует четыре типа опросов. Они организовали это таким образом, что существует много проектов, и каждый проект может иметь только одну съемку каждого типа (STI здесь?), И опрос принадлежит одному проекту. Каждый опрос будет получать отчет из локального приложения, поэтому в нем будет много отчетов. Приложение Rails 3, которое регистрирует эти отчеты, должно как-то имитировать эту логику. Первый вопрос: имеет ли эта структура AR смысл для вас?

  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

Второй вопрос касается наличия нескольких таблиц для одной модели AR. Если все данные будут сохранены в таблице reports, таблица очень быстро станет огромной, и через некоторое время могут возникнуть проблемы с эффективными запросами к отчетам, относящимся к конкретному опросу. Может быть, было бы лучше иметь отдельные таблицы для каждого опроса? Как reports_<survey_id>. Возможно ли это?

Кроме того, я как-то вынужден использовать MySQL, но если есть другое, гораздо лучшее решение для этого, я мог бы попытаться протолкнуть его.

Если вы все еще здесь, спасибо, что прочитали это:)

Ответы [ 2 ]

5 голосов
/ 17 мая 2011

Второй вопрос - наличие нескольких таблиц для одной модели AR.Если все данные будут храниться в таблице отчетов, таблица очень быстро станет огромной, и через некоторое время может возникнуть проблема с эффективными запросами к отчетам, относящимся к определенному опросу.Может быть, было бы лучше иметь отдельные таблицы для каждого опроса?Как отчеты_.Возможно ли это?

Да, это возможно.

Вы можете сделать это следующим образом:

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

Report.table_name_suffix = 'foo'

ОБНОВЛЕНИЕ


# 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
5 голосов
/ 15 мая 2011

Поместите индекс на каждый из ваших внешних ключей (например, Reports.survey_id) и передышку. Вы слишком сильно беспокоитесь о производительности прямо сейчас. Вам понадобится минимум миллионов записей в таблице отчетов, прежде чем вы увидите какие-либо проблемы с производительностью из MySQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...