質問: 初歩的な質問で申し訳ありません。 以下のようなデータ構造を考えた場合、Position の親子関係(has_many,belongs_to等)はとる必要があるのかを教えていただきたくお願いいたします。 わからないのは Position は Home からも Road からも参照されるため、取り扱いの方法がわかりません。 * Home 家情報 Homeは1つのPositionをもってる * Road 道情報 Roadは複数のPositionをもってる。Positionを繋ぐと道になるイメージ * Postion 座標情報 Positionはx、y座標をもってる 1個のPosition情報はHomeからもRoadからも参照される場合がある お聞きしたい内容はおおよそ以下の3点です。 (1) Positionは「誰とも親子関係をむすばない」で正しいでしょうか? (2) Positionは誰とも親子関係をむすばないとした場合、Homeのテーブルはposition_idフィールドを1つ持ち、Positionが必要な時にposition_idで検索するべきなんでしょうか? (3) RoadはPositionを複数もっているため中間結合テーブルRoadPositionsを作成して対応するべきなんでしょうか?
回答: 関連は必ずしも双方向に設定する必要はありません。「親子関係」という言葉に引きずられて余計な制約を想像されてるような気がします。 > > (1) Positionは「誰とも親子関係をむすばない」で正しいでしょうか? > > > `Position`から`Home`や`Road`を引っ張ってくる必要が無ければ、`Position`からの関連を設定する必要はありません。 > > (2) Positionは誰とも親子関係をむすばないとした場合、Homeのテーブルはposition_idフィールドを1つ持ち、Positionが必要な時にposition_idで検索するべきなんでしょうか? > > > `Home`に`position_id`を持たせるのはそれでよいとして、`belongs_to :position`として関連を設定すれば良いでしょう > > (3) RoadはPositionを複数もっているため中間結合テーブルRoadPositionsを作成して対応するべきなんでしょうか? > > > ``` a | b---c---d | e ``` a~eがそれぞれの`Position`のレコードで、「a-c-e」とか「b-c-d」で`Road`を表現するということだと思いますが、`Road`は単に複数の`Position`を持っているというだけでなく、「a-c-e」(a-e-cではなく)というつながりも表現する必要があると思います。 単純に多対多の関連で済ませて中間テーブルにソート順みたいなものを持たせるので十分なのか、別の表現方法やデータ構造で保存した方がいいのかはデータ量とか利用方法によって変わってきます。グラフについてのアルゴリズムの知識が必要です。