外部キーだけではなく、Django モデルで 1 対 1 の関係を指定することの重要性を誰かが説明できますか?
具体的には、関係を 1 対 1 と指定することで得られる利点があるとしたら、どのような利点があるのか疑問に思っています。
本当にありがとう。
外部キーだけではなく、Django モデルで 1 対 1 の関係を指定することの重要性を誰かが説明できますか?
具体的には、関係を 1 対 1 と指定することで得られる利点があるとしたら、どのような利点があるのか疑問に思っています。
本当にありがとう。
OneToOneField
'ForeignKey' の後に Django で進化しました。概念的にはForeignKey
withunique=True
制約は に似ていOneToOneField
ます。
したがって、すべての写真に 1 人のユーザーがいて、その逆の場合はOneToOneField
.
1 人のユーザーに任意の数の写真を持たせたい場合は、ForeignKey
.
物の選び方も違います。の場合はOneToOneField
、user.picture を実行して画像を直接取得できます。最初の写真を取得するForeignKey
かuser.picture_set[0]
、そのユーザーに関連付けられているすべての写真にアクセスする場合。
MultiTableInheritanceは暗黙的に OneToOneField を内部的に使用しており、その概念がどこから生まれたかがわかります。
それらは同じではありません。考えてみてください:
User
aと a の間に 1 対 1 の関係があるPicture
場合、ユーザーは 1 つの写真しか持てない (そして、1 つの写真は 1 人のユーザーしか持てない) ことを意味します。Picture
へのwith 外部キーを持っている場合User
、画像には正確に 1 人のユーザーが必要ですが、ユーザーは 0、1、または複数の画像を持つことができます。
1-1 の追加の制約により、より厳密で豊富な概念モデルが提供されますが、より直感的な検索を可能にする洞察も提供されます。多対 1 は親/コレクションの関係を表すため、特定のエンティティの特定のコレクションの取得に関連する不明確なコストがあります。1 対 1 はフラット マッピングを提供するため、取得コストもフラットです。これは、結合を簡単に最適化でき、結果のデータセットが既知のサイズになるため、関連する場合に熱心なフェッチを優先するなどのことにつながります。
Django の外部キーは多対 1 の関係です。現在、それらの違いは、1 対 1 の関係と多対 1 の関係の違いと同じです。たとえば、ユーザー エンティティとプロファイル エンティティがあるとします。各ユーザーが 1 つのプロファイルのみを持つことができるという制約を追加したいと考えています。次に、django の 1 対 1 フィールドを使用すると、データベース レベルで制限が作成され、ユーザーを複数のプロファイルに関連付けたり、その逆を行うことができなくなります。外部キーを使用してもこの制約は提供されません。