Как бы вы представили следующий набор данных на уровне модели в приложении MVC? - PullRequest
2 голосов
/ 19 февраля 2010
        Foreign Direct Investment (% GDP)   


            2000    2001    2002    2003    2004    2005    2006
Brazil    5.09    4.05    3.28    1.84    2.74    1.7     1.73      
China      3.22    3.36    3.39    2.86    2.84    3.44    2.81     
India      0.78    1.15    1.11    0.73    0.83    0.94    2.13     
Mexico    2.87    4.43    3.37    2.35    3.11    2.57    2.01

У меня есть 2 идеи для моего приложения Ruby on Rails:

1) Имеется 3 модели:

  • MetricType будет содержать тип метрики (FDI) и будетиметь много объектов DataPoint
  • DataPoint будет иметь значение и год и будет принадлежать одному объекту Country и одному объекту MetricType
  • Объект Country также будет иметь много объектов DataPoint (представляющих строку)

2) Менее нормализовано, но, возможно, более эффективно для обработки большого количества данных

  • MetricType будет содержать тип метрики (FDI) и будет иметь много объектов DataSet
  • DataSet будет принадлежать одному MetricType и одному объекту Country
  • DataSet будет иметь массив хэшей для представления значений - [{"year" => "value"}, {"year" => "value"}, ...]

Это оба хорошие методы для абстрагирования данных?Что бы вы использовали или предложили бы альтернативный метод?

Спасибо!

1 Ответ

1 голос
/ 19 февраля 2010

Это зависит от того, насколько динамичной должна быть ваша система. Вы можете сделать это просто с одним классом (и таблицей БД) для каждого типа метрики и связать их с помощью Country.has_many: foreign_direct_investment_metrics и т. Д. (Проще).

Или вы можете работать более динамично, я бы использовал наследование одной таблицы для метрик, например:

class Country < ActiveRecord::Base
  has_many :data_points, :class_name => 'Metric'
  has_many :foreign_direct_investments, :class_name => 'ForeignDirectInvestment'
end

class Metric < ActiveRecord::Base
  belongs_to :country
end

class ForeignDirectInvestment < Metric
end

class OtherMetricType < Metric
end

# c = Country.new(:name => 'Brazil')
# c.data_points << ForeignDirectInvestment.new(:year => 2000, :value => 5.09)
# c.save

И ваша схема БД:

  create_table "countries", :force => true do |t|
    t.string   "name"
    t.datetime "created_at"
    t.datetime "updated_at"
  end   

  create_table "metrics", :force => true do |t|
    t.integer  "country_id"
    t.string   "type"
    t.integer  "year"
    t.float    "value"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

Это позволяет добавлять методы в ForeignDirectInvestment, сохраняя при этом гибкость для записи большего количества метрик. Тем не менее, у STI ActiveRecord есть предостережения, такие как все ваши ключи для всех ваших моделей должны находиться в таблице базовых метрик. Здесь есть хорошее введение в ИППП: http://juixe.com/techknow/index.php/2006/06/03/rails-single-table-inheritance/

Вы можете также рассмотреть документ db, например MongoDb. MongoMapper - это простой картограф данных для Mongo и Rails, который также облегчает решение подобных проблем. Смотри http://mongomapper.com/

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