35892


初歩的な質問で申し訳ありません。  
以下のようなデータ構造を考えた場合、Position
の親子関係(has_many,belongs_to等)はとる必要があるのかを教えていただきたくお願いいたします。  
わからないのは Position は Home からも Road からも参照されるため、取り扱いの方法がわかりません。

  * Home  
家情報  
Homeは１つのPositionをもってる

  * Road  
道情報  
Roadは複数のPositionをもってる。Positionを繋ぐと道になるイメージ

  * Postion  
座標情報  
Positionはx、y座標をもってる  
１個のPosition情報はHomeからもRoadからも参照される場合がある

お聞きしたい内容はおおよそ以下の3点です。  
(1) Positionは「誰とも親子関係をむすばない」で正しいでしょうか？

(2)
Positionは誰とも親子関係をむすばないとした場合、Homeのテーブルはposition_idフィールドを１つ持ち、Positionが必要な時にposition_idで検索するべきなんでしょうか？

(3) RoadはPositionを複数もっているため中間結合テーブルRoadPositionsを作成して対応するべきなんでしょうか？


CC BY-SA 3.0
2017-06-24T11:10:20.560
35857
2017-06-26T06:24:05.847
13909
question
ruby-on-rails
ruby on rails におけるモデル（DB）設計について


>   * Home  
>  家情報  
>  Homeは１つのPositionをもってる
>   * Road  
>  道情報  
>  Roadは複数のPositionをもってる。Positionを繋ぐと道になるイメージ
>   * Postion  
>  座標情報  
>  Positionはx、y座標をもってる  
>  １個のPosition情報はHomeからもRoadからも参照される場合がある
>

何が何を持っているのか、ここまでまとまってるのでしたら、そのまま以下のように設定すれば良いかと思います。

  * Home
[code]     has_one :position

    
[/code]

  * Road
[code]     has_many :positions

    
[/code]

  * Position
[code]     belongs_to :home

    belongs_to :road
    
[/code]

テーブルとしては、positions テーブルに home_id と road_id を持たせる感じです。  
homes や roads テーブルには position_id は不要です。

(1)〜(3) のご質問に対する回答としては、

(1) 結べば良いと思います  
(2) 結ぶので回答を省略します  
(3) positions の複数のレコードの road_id が同じ値になるだけです。中間テーブルは不要と思います。

となります。


CC BY-SA 3.0
2017-06-24T16:16:30.723
35861
2017-06-24T16:16:30.723
5288
35857
answer


関連は必ずしも双方向に設定する必要はありません。「親子関係」という言葉に引きずられて余計な制約を想像されてるような気がします。

> (1) Positionは「誰とも親子関係をむすばない」で正しいでしょうか？

`Position`から`Home`や`Road`を引っ張ってくる必要が無ければ、`Position`からの関連を設定する必要はありません。

> (2)
> Positionは誰とも親子関係をむすばないとした場合、Homeのテーブルはposition_idフィールドを１つ持ち、Positionが必要な時にposition_idで検索するべきなんでしょうか？

`Home`に`position_id`を持たせるのはそれでよいとして、`belongs_to :position`として関連を設定すれば良いでしょう

> (3) RoadはPositionを複数もっているため中間結合テーブルRoadPositionsを作成して対応するべきなんでしょうか？
[code]

          a
          |
      b---c---d
          |
          e
    
[/code]

a～eがそれぞれの`Position`のレコードで、「a-c-e」とか「b-c-d」で`Road`を表現するということだと思いますが、`Road`は単に複数の`Position`を持っているというだけでなく、「a-c-e」(a-e-
cではなく）というつながりも表現する必要があると思います。

単純に多対多の関連で済ませて中間テーブルにソート順みたいなものを持たせるので十分なのか、別の表現方法やデータ構造で保存した方がいいのかはデータ量とか利用方法によって変わってきます。グラフについてのアルゴリズムの知識が必要です。


CC BY-SA 3.0
2017-06-26T06:24:05.847
35892
2017-06-26T06:24:05.847
5793
35857
answer