2014-12-17 2 views
0

Я смущен относительно того, как работает связь с базой данных.Ruby Sinatra Datamapper/путаница базы данных

Скажем, у меня есть пересечение границы («пересечение»), которое имеет два направления («север», «юг»), каждое из которых имеет два типа полос («нормальный», «быстрый») каждая из которых имеет 2 метрики (= данные) («delay», «queue_length»).

На самом деле существует несколько переходов, с большим количеством типов дорожек и более метрик.

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

Я наткнулся на Datamapper, и так как я учусь, как нам Синатра, я думал, что отдам это. В учебнике (http://datamapper.org/getting-started.html) часть «один ко многим» просто закричала «это то, что вам нужно», поэтому я начал возиться.

require 'data_mapper' 

    DataMapper.setup(:default, ENV['DATABASE_URL'] || "sqlite3://#{Dir.pwd}/development.db") 

     class Crossing 
     include DataMapper::Resource 

     property :id, Serial 
     property :name, String,:unique=>true 
     has n, :directions 
    end 

    class Direction 
     include DataMapper::Resource 

     property :id, Serial 
     property :direction, String,:unique=>true 
     belongs_to :crossing 
     has n, :lanes 
    end 

    class Lane 
     include DataMapper::Resource 

     property :id, Serial 
     property :lane, String 
     belongs_to :direction 
     has n, :datas 
    end 

    class Data 
     include DataMapper::Resource 

     property :id, Serial 
     property :name, String,:unique=>true 
     property :value, String 
     belongs_to :lane 
    end 

    DataMapper.finalize.auto_migrate! 

Я просто подумал, что это выглядело так элегантно говоря: «пересечение имеет п направления, направление имеет п полосы, и т.д.»

Тогда:

Crossing.create(:name => "crossing") 

    Direction.create(:direction => "north") 
    Direction.create(:direction => "south") 

    Lane.create(:lane => 'normal') 
    Lane.create(:lane => 'fast') 

    Data.create(:data => 'delay') 
    Data.create(:data => 'queue_length') 

    // now how do I retrieve find the data of a lane of a direction of a crossing? 

Теперь, что я буду ввод и извлечения все время является частью данных. Все это имеет смысл, или я просто не понимаю, для каких табличных ассоциаций? Я знаю, что вместо этого у меня может быть гигантский объект, но я уверен, что это странный способ делать что-то.

@crossing = { 
     'crossing name' => { 

     :directions => { 

      :north => { 

      :normal => { 

       :delay => '10 min', 

       :queue => '100 m' 
      }, 

      :fast => { 

       :delay => '1 min', 

       :queue => '10 m' 
      } 
      }, 

      etc etc etc 

    } 

, а затем получить доступ к данным, как @crossing [: север] [: нормальный] [: задержка] .... но я вроде чувствую, как база данных будет лучше?

Имею ли я какой-либо смысл? У кого-нибудь есть несколько указателей на молодого кузнечика?

ответ

0

Я предпочел бы пойти с этой структурой:

  • Data принадлежит Crossing, Direction и Lane; он имеет свойство delay и queue
  • Direction имеет много Data, и имеет ровно два ряда
  • Lane имеет много Data, и имеет ровно два ряда
  • Crossing имеет много Data, и имеет много строк

Причина в том, что вы не хотите повторять строки "north", "south" и т. Д. В вашей базе данных.

Затем первое семя база данных с постоянными таблицами:

Direction.create(direction: 'north') 
Direction.create(direction: 'south') 

Lane.create(lane: 'normal') 
Lane.create(lane: 'fast') 

Затем вы можете сделать ваши переходы:

cool_crossing = Crossing.create(name: 'My Cool Crossing') 
not_cool_crossing = Lane.create(name: 'My Not So Cool Crossing') 

и добавления точек данных:

north = Direction.first(name: "north") 
normal = Lane.first(name: "normal") 

Data.create(
    crossing: cool_crossing, 
    lane: normal, 
    direction: north, 
    delay: 10, 
    queue: 1 
) 

и извлечения данных по:

all_data_for_cool_crossing = Data.all(
    crossing: cool_crossing 
) 

или

data_for_cool_crossing_normal_north = Data.first(
    crossing: cool_crossing, 
    lane: normal, 
    direction: north 
) 
+0

Это прохладный путь! Было всего несколько обручей (я не могу использовать Data, потому что «Есть встроенный тип с именем Data») Большое вам спасибо! – cannotcompute

+0

Да, извините, не испытал вообще. – Amadan

Смежные вопросы