2

私は本を​​読んでいましたが、Userhas some moreについて話しているUserDetailので、UserDetailuser_idUsers テーブルを指しています。それをちょっと忘れていましたが、UserDetail レコードを指すようにUsersテーブルにフィールドを持つことはまったく役に立ちますか?user_detail_id

これは Ruby on Rails でもそうで、Usersテーブルには がありませんuser_detail_idが、UserDetailテーブルには がありますuser_id。とUserモデル使用has_one :user_detailUserDetailモデル使用中belongs_to :user

一対多の関係の場合、「多」側ではforeign_id「一」側を指す必要がありますが、「一」側は指し示す必要がないというのは理にかなっています。 「多」側なので、1 対 1 の場合は両方向を指す必要はないように見えます。一方の側で十分なためです。

4

4 に答える 4

2

行を削除したい場合はどうしますか? 制約を無効にする必要があります!

于 2010-09-05T15:58:12.407 に答える
2

その通りです。外部キーに関しては、関係を一方向に設定するだけで済みます。ただし、Rails の ActiveRecord 関連付けを使用すると、どちらの側からでも関連付けをトラバースできることに注意してください。例えば:

@user.user_detail

# Or
@user_detail.user
于 2010-09-05T15:58:23.437 に答える
2

「多」側では、「一」側を指すforeign_idがありますが、「一」側は「多」側を指す必要がないため、1対1のように見えます片面で十分なので、両方の方向を指す必要もありません。

リレーションシップの両側に外部キーを実装することはありません。制約では情報が両方のテーブルに同時に存在する必要があるため、制約を無効にしないとデータを挿入できません。2 つのテーブルの 1 つは親エンティティと見なす必要があり、子エンティティは参照整合性のために parent_id に依存します...

しかし、一般的にテーブルを 1 対 1 の関係でモデル化しない理由は理解できたと思います。主キーを(少なくとも)外部キーとして複製し、追加の手荷物として外部キー制約を含めることにより、無意味なオーバーヘッドが発生します。パフォーマンスの問題に対処するために、1 対 1 のテーブルが使用されます。パフォーマンスの問題がない限り、それは時期尚早の最適化です...

于 2010-09-05T18:24:22.597 に答える
1

1 対 1 の場合、「多」の部分が常に「1」になることを除けば、1 対多とまったく同じと考えることができます。そうは言っても、「多」側に外部キーを配置するだけで十分であり、二重ポインティングは必要ありません。それはそれと同じくらい簡単です。

于 2010-09-05T15:58:37.113 に答える