0

1 人が多くの投稿を持っている場合、People テーブルと Posts テーブルのいずれかを使用できます。Posts テーブルの各エントリには、People のエントリを指すキーがあります。典型的な has_many 関係。

または、People テーブルと Posts テーブル、および People 内のエントリと Posts 内のエントリの両方のキーを持つリレーション テーブルを使用してそれらを接続することもできます。

どちらも実行可能のようですが、どちらを選択するかをどのように決定すればよいですか?

4

6 に答える 6

2

あなたが公開した2つのソリューションは、実際には2つの異なる問題を解決します:

  • 最初のものは関係です (ガイドのone to many詳細情報)。基本的に、投稿は一意の投稿に関連付けられているため、追加のテーブルは必要ありません。

  • 何らかの方法で投稿が複数の一意の人物に関連している場合、many to many関係があります (詳細についてはガイドを参照してください)。その場合、 と のjoin tabepostsで、peopleどの人が投稿に関連付けられているか、どの投稿がユーザーに関連付けられているかを知ることができます。(ガイドのhas_many :through詳細情報) を使用することもできますが、これは別の説明です。

于 2013-03-28T16:31:47.890 に答える
1

「多対多」の関係がある場合は、3 番目のテーブル (結合テーブル) を使用します。つまり、1 人の人物が多数の投稿を持つことができ、1 つの投稿が多数の人を持つことができます。

あなたの例では、投稿が1人にしか属さない場合、それは「1対多」であり、結合テーブルを作成する必要はなく、作成するべきではありません。posts テーブルの外部キーは、投稿が 1 人のユーザーのみに属していることを保証します。結合テーブルを使用すると、その制約を破ることができます。

于 2013-03-28T16:30:28.893 に答える
0

結合テーブルがある場合、それは通常、2 つのモデル間に多対多の関係があることを意味します。あなたの例では、投稿が多くのユーザーに属することができ、ユーザーが多くの投稿に属することができることを意味します。

結合テーブルを使用していない場合は、2 つのモデル間に 1 対多または 1 対 1 の関係があることを意味します。以下の次のケースを見てください。

ケース 1: 投稿の user_id

これはbelong_to、ユーザーを投稿することを意味します。また、ユーザーは投稿との関係has_manyまたはhas_one関係を持つことができます

ケース 2: ユーザーの post_id

明らかに、これはケース 1 の正反対です。しかし、外部キーをどこに配置するかは、データベース モデルにとって重要であることを強調しなければなりません。

于 2013-03-28T16:34:49.173 に答える
0

違いは、これらが 2 つの異なる関係であることです。

  • "has_many" (接続テーブルなし) は、ある人が多くの投稿を持っており、投稿が UNIQUE の人に属していることを意味します。
  • 「has_and_belongs_to_many」(この接続テーブルを使用) は、ある人に多くの投稿があり、投稿には多くの人がいるということを意味します。

一対多、多対一、多対多の違いは?

于 2013-03-28T16:30:36.087 に答える
0

方法 2(多対多) は、投稿に複数の作成者がいる場合にのみ必要ですが、これはまれなケースです。

ほとんどの場合、あなたの方法 1 で十分です。

于 2013-03-28T16:30:48.677 に答える
0

関連するエントリを複数の所有者間で共有できない場合は、「1 対多」の関係 (1 つのテーブルが別のテーブルへの外部キーを持つ) を使用します。あなたの例では、投稿が1人のユーザーにのみ属している場合、この種の関係シップを使用します(PostsテーブルにはPeopleテーブルへの外部キーが含まれます)。

リレーション テーブルを使用して、「多対多」のリレーションシップを表します。例を引き続き使用すると、People が複数の投稿を持つことができ、Post が複数の人に属することができる場合 (投稿が複数の人によって作成される可能性があると想像してください)、それらの関係を格納するために 3 番目のテーブルが必要になります。この関係テーブルにより、同じ投稿 ID に関連付けられた複数の人物 ID、または同じ人物に関連付けられた複数の投稿 ID を持つことができます。

よろしく

于 2013-03-28T16:38:19.963 に答える