2012-02-06 7 views
1

私のモデルでは、私はConcertクラスとVenueクラスを持っています。各会場には複数のコンサートがあります。私は会場のオブジェクトの主キーを含む...シンプルなぜmodels.ForeignKeyが有利ですか?

venue = models.IntegerField(max_length = 10)

で会場にコンサートクラスをリンクされています。同僚は代わりにvenue = models.ForeignKey(Venue)を使用するよう提案しました。これも同じですが、私はConcert.objects.filter(venue=4)の会場のIDをForeignKeyVenue_instance.Concert_set.all()と同じように使って、会場のすべてのコンサートをパースすることができたので、それは価値があるのだろうかと思います。私は自分の方法を使っても問題は一度もありませんでした。

IntegerFieldobjects.filter()を使用すると、ForeignKeyと同じくらい多くの「ManyToOne」関係があるので、私はどこが間違っているか知りたいと思います。 ForeignKeysはなぜ有利なのですか?彼らはより速いのですか?より良いデータベース設計ですか?クリーナーコード?

+0

私はそれが完全性と関係があると思います。 'venue'を' Venue'テーブルに存在しない値に設定できますか? 1つまたは他のデザインを使用してそのテーブルのキーを更新または削除するとどうなりますか? –

+0

私はそれを検討するべきだと思います。これはあなたが考えることができる唯一の問題ですか?それは私を心配するものではありません。 –

+0

スイッチを作るだけです。初心者にとっては、現在のアプローチでは、プライマリキースキームが偶然に変更された場合、あなたは嫌な思いをします。 – Marcin

答えて

3

私は、外部キーの最も実用的な利点は、関係間で自動的に照会できることです。 Djangoは自動的にJOINを生成します。

あなたが言及したように、自動リバースリリーフヘルパーも素晴らしいです。

ここでは、整数関係だけではさらに複雑になるいくつかの例を示します。他の人が指摘したように

concerts = Concert.objects.filter(...) 

concerts.order_by('venue__attribute') # ordering beyond PK. 
concerts.filter(venue__name='foo') # filter by a value across the relationship 
concerts.values_list('venue__name') # get just venue names 
concerts.values('venue__city').annotate() # get unique values across the venue 

concerts.filter(venue__more__relationships='foo') 

Venue.objects.filter(concert__name='Coachella') # reverse lookups work too 

# with an integer field for Concert.venue, you'd have to do something like... 
Venue.objects.filter(id__in=Concert.objects.filter(name='Coachella')) 

...データベースの整合性が(もちろんカスタマイズ可能)削除をカスケード、有用であり、手のひらを顔に当てるはそれだけで外部キーと驚くほど私にはそのDjangoのadminとフォームフレームワークの仕事を発生しました。

class ConcertInline(admin.TabularInline): 
    model = Concert 

class VenueAdmin(admin.ModelAdmin): 
    inlines = [ConcertInline] 
    # that was quick! 

外部キーを処理するdjango機能の例がたくさんあると確信しています。

+1

FKは通常、[参照整合性](http://en.wikipedia.org/wiki/Referential_integrity)を強制します。 –

+0

すべての例をありがとう。私はDjangoを使うつもりなら、Djangoを正しく使うかもしれないと思いますか?あなたがしていることを知っているようだから、もう1つの質問:外国キーのリストを保存する最良の方法は何ですか?たとえば、コンサートにはさまざまな数のBandオブジェクトがあります。 –

+0

ManyToMany、正しい? –

3

ForeignKeyはreferential integrityを強制するほとんどのデータベースで実装されているdatabase conceptです。

djangoは、この列が参照するものがテーブルであることを知っているため、他のテーブルの外部キーとなる可能性があります。これは、SQL内の対応する結合を生成する関係を連鎖させるのに役立ちます。

Djangoは通常の一方向チェインとは異なり、認識したように反対側にパラメータを追加します。会場インスタンスがある場合、venue.concert_setを照会することができます。

  • あなたが参照整合性チェックを持っていない:

    FKを使用して整数を使用して、独自の圧延ないで一番私を悩ます事はということです。

  • あなたはSQLの能力を失います。あなたが参加することができないので、あなたのすべての適度な深いクエリは、データベースに複数ヒットする必要があります。あなたはまた、フレームワークがSQLを扱うために提供するすべての指針を失います。
+0

それは気づくべき良いことです、ありがとう。 –

関連する問題