2

外部キーだけではなく、Django モデルで 1 対 1 の関係を指定することの重要性を誰かが説明できますか?

具体的には、関係を 1 対 1 と指定することで得られる利点があるとしたら、どのような利点があるのか​​疑問に思っています。

本当にありがとう。

4

4 に答える 4

10

OneToOneField'ForeignKey' の後に Django で進化しました。概念的にはForeignKeywithunique=True制約は に似ていOneToOneFieldます。

したがって、すべての写真に 1 人のユーザーがいて、その逆の場合はOneToOneField.

1 人のユーザーに任意の数の写真を持たせたい場合は、ForeignKey.

物の選び方も違います。の場合はOneToOneField、user.picture を実行して画像を直接取得できます。最初の写真を取得するForeignKeyuser.picture_set[0]、そのユーザーに関連付けられているすべての写真にアクセスする場合。

MultiTableInheritanceは暗黙的に OneToOneField を内部的に使用しており、その概念がどこから生まれたかがわかります。

于 2012-10-29T06:52:33.783 に答える
2

それらは同じではありません。考えてみてください:

Useraと a の間に 1 対 1 の関係があるPicture場合、ユーザーは 1 つの写真しか持てない (そして、1 つの写真は 1 人のユーザーしか持てない) ことを意味します。Pictureへのwith 外部キーを持っている場合User、画像には正確に 1 人のユーザーが必要ですが、ユーザーは 0、1、または複数の画像を持つことができます。

于 2012-10-29T03:04:49.513 に答える
2

1-1 の追加の制約により、より厳密で豊富な概念モデルが提供されますが、より直感的な検索を可能にする洞察も提供されます。多対 1 は親/コレクションの関係を表すため、特定のエンティティの特定のコレクションの取得に関連する不明確なコストがあります。1 対 1 はフラット マッピングを提供するため、取得コストもフ​​ラットです。これは、結合を簡単に最適化でき、結果のデータセットが既知のサイズになるため、関連する場合に熱心なフェッチを優先するなどのことにつながります。

于 2012-10-29T03:41:41.883 に答える
0

Django の外部キーは多対 1 の関係です。現在、それらの違いは、1 対 1 の関係と多対 1 の関係の違いと同じです。たとえば、ユーザー エンティティとプロファイル エンティティがあるとします。各ユーザーが 1 つのプロファイルのみを持つことができるという制約を追加したいと考えています。次に、django の 1 対 1 フィールドを使用すると、データベース レベルで制限が作成され、ユーザーを複数のプロファイルに関連付けたり、その逆を行うことができなくなります。外部キーを使用してもこの制約は提供されません。

于 2012-10-29T03:03:02.650 に答える