2011-01-28 53 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」字段是空的,我不認爲有什麼辦法避免這種情況,是嗎?

不過,我也有配偶可爲空ForeignKey的,爲自己的孩子遞歸ManyToManyField,以及教會的ForeignKey可爲空(如果相關)。

我的問題 - 首先,目前對可空的外鍵的共識是什麼?我應該在這裏允許嗎?還是我應該創造某種「無人」或「未分配」模式來表示沒有配偶/家庭教會?

或者是有,我可以在Django返工這樣的設計,以適應這一些其他的方式?

如果我不跟空FK繼續前進,是否有在Django我需要知道什麼注意事項? (左加入?)

乾杯, 維克多

+0

只有我自己的2美分,但我覺得空的外鍵是完全正常的,幾乎不可缺少的大部分時間。沒有Django的注意事項,我能想到的和ORM將處理他們的罰款。 – Mikesname 2011-01-28 15:57:13

回答

0

空是完全沒有問題。在python代碼None將代表Null。你應該知道

一個重要的事情是,如果你刪除教堂,Django的執行級聯,並從那個教會你的人也將被刪除。所以在刪除教堂之前,你需要在教堂裏爲每個人在教堂裏設置Null。

的Django 1.3引入on_delete參數,這使得這個有很多假笑。

0

被大多數DBMS的實現沒有太大的邏輯意義空的外鍵。不同的DBMS處理它們的方式也有一些不一致之處。因此,可空的外鍵很可能導致錯誤的結果。他們很容易通過相關的屬性(一個或多個)移動到一個新表,只填充該表,當你有一個值和填充它只是避免。

0

當外鍵被標記爲空=真,Django會處理與LEFT OUTER JOIN的JOIN,至少與Oracle數據庫據我所知,有這麼沒問題。