2011-01-28 4 views
1

私は人モデルとDjangoのモデルを持っている:Djangoのデータベース設計 - ヌルForignキー

class Person(models.Model): 
    # Personal details 
    first_name = models.CharField(max_length=50) 
    middle_name = models.CharField(max_length=50, blank=True, null=True) 
    last_name = models.CharField(max_length=50) 
    gender = models.CharField(max_length=1, choices=GENDER_CHOICES) 
    date_of_birth = models.DateField() 

    # Address 
    street_address = models.CharField(max_length=50) 
    suburb = models.CharField(max_length=30) 
    postcode = models.CharField(max_length=4) 
    state = models.CharField(max_length=3, choices=STATE_CHOICES) 

    #Contact Details 
    email = models.EmailField() 

    # Family 
    spouse = models.ForeignKey('self', null=True, blank=True) 
    children = models.ManyToManyField('self', null=True, blank=True) 

    home_church = models.ForeignKey('Church', null=True, blank=True) 

「MIDDLE_NAME」フィールドがNULL可能である、私はそれを避けるためにどのような方法はないと思う、あるのでしょうか?

しかし、私は配偶者のためのnullable ForeignKey、子孫のための再帰ManyToManyField、および関連する場合はnull nullのForeignKeyも持っています。

私の質問 - まず、null可能な外部キーの現在のコンセンサスは何ですか?私はここでそれを許すべきですか、または私は配偶者/自宅教会を持たないことを表すために何らかの "誰も"、あるいは "割り当てられていない"モデルを作成すべきですか?

また、これに対応するためにこのデザインをDjangoで再作成できる方法がいくつかありますか?

私がヌルFK'sを先に進めれば、Djangoには注意が必要な警告がありますか? (左参加?)

乾杯を、 ビクター

+0

自分の2セントしかありませんが、ヌル入力可能な外部キーは完全に細かく、事実上不可欠です。私が考えることができるDjangoの注意点はありません。そして、ORMはそれらをうまく処理します。 – Mikesname

+0

+1 Mikesname –

答えて

0

ヌルは完全に罰金です。 PythonコードNoneNullを表します。

あなたが知っておくべき重要なことは、教会を削除するとdjangoがカスケードを実行し、その教会のPersonsも削除されることです。だから、教会を削除する前に、その教会のすべての人のために教会場にNullを設定する必要があります。

Django 1.3は、これをもっと簡単にするon_delete引数を導入しています。

0

ほとんどのDBMSで実装されているヌル可能な外部キーはあまり論理的に意味がありません。また、異なるDBMSがそれらを処理する方法にはいくつかの矛盾があります。その結果、null可能な外部キーが誤った結果を招く可能性が非常に高くなります。問題の属性を新しいテーブルに移動し、そのテーブルに値を設定するときにそのテーブルにデータを入力するだけで簡単に回避できます。

0

外部キーがnull = Trueとマークされている場合、DjangoはLEFT OUTER JOIN(少なくともOracleデータベースAFAIK)を持つJOINを処理しますので、問題はありません。

関連する問題