2011-04-12 60 views
4

這是一個比特定的Django更多的數據庫設計問題。Django DB Design - 維護常見和歷史數據

我們有一個小型的Django應用程序來管理年度會議。

會議每年都有一些常見的模式。例如,研討會通常每年重複一次,我們也經常使用相同的房間(研討會或住宿房間)。

對於這些模型,其中一些領域每年都很常見,而其他領域則有所不同。

例如,每個AccomodationRoom都有一個名稱,建築物和功能,這在每年都會很常見。然而,其他的事情,如實際的牀位可用性將每年不同。

需要每年保留歷史數據,但我們也希望儘可能減少冗餘重複,並且每年不必重新輸入一次(例如,房間名稱,其網站及其名稱功能。同樣適用於研討會)

我最初的做法是創建一個AccomodationRoom,用於存儲常用數據,然後有例如BedAvailability存儲瞬時年度信息,並提供每年的鏈接會議。例如:

class AccommodationRoom(models.Model): 
    name = models.CharField(max_length=50) 
    site = models.ForeignKey(Site) 
    features = models.ManyToManyField(AccommodationFeature, null=True, blank=True) 

class BedAvailability(models.Model): 
    number_of_single_beds = models.IntegerField() 
    number_of_double_beds = models.IntegerField() 
    conference = models.ForeignKey(Conference) 
    accommodation_room = models.ForeignKey(AccommodationRoom) 

class Conference(models.Model): 
    year = models.CharField(max_length=4) # Example 

然而,另一種方法是簡單地廢除了兩款車型,並有一個AccomodationRoom模型,它包含了一切,直接鏈接此向大會型號,然後執行有關AccomodationRoom獨特性.name和AccomodationRoom.Conference。

class AccommodationRoom(models.Model): 
    name = models.CharField(max_length=50) 
    site = models.ForeignKey(Site) 
    features = models.ManyToManyField(AccommodationFeature, null=True, blank=True) 
    conference = models.ForeignKey(Conference) 
    number_of_single_beds = models.IntegerField() 
    number_of_double_beds = models.IntegerField() 

    class Meta: 
     ordering = ['conference', 'name'] 
     unique_together = (("name", "conference"),) 

或者有沒有更好的方法可以做到這一點,我沒有想到?打開這裏的建議。

乾杯, 維克多

+0

這是一個古老的問題,但我有類似的情況,並會很高興聽到更多的意見(寫作時沒有答案)。 – 2013-02-16 23:17:27

+0

您是否打算使用Django管理應用程序來管理這些模型? – sul4bh 2013-02-19 14:05:11

回答

1

一個小的修改,以你的第一個解決方案(我認爲這是更好的解決方案,因爲它比第二個更爲標準化)

class AccommodationRoom(models.Model): 
    name = models.CharField(max_length=50) 
    site = models.ForeignKey(Site) 
    features = models.ManyToManyField(AccommodationFeature, null=True, blank=True) 
    bed_availability = models.ForeignKey(BedAvailability) 

class BedAvailability(models.Model): 
    number_of_single_beds = models.IntegerField() 
    number_of_double_beds = models.IntegerField() 

class Conference(models.Model): 
    year = models.CharField(max_length=4) # Example 
    accommodation = models.ForeignKey(AccommodationRoom) 

使用Django管理後臺,您可以先使用牀的規格創建BedAvailability對象。然後,您可以創建AccomodationRoom對象並將BedAvailability對象與它關聯。然後,您可以最終創建一個會議對象,並將這個對象與AccommodationRoom對象關聯。

如果您需要爲同一客廳另一年新設置一套BedAvailability,則可以使用新規格創建一個新的BedAvailability對象,並將其與AccommodationRoom關聯。即使BedAvailability規格發生變化,您也不需要重新輸入下次會議的AccommodationRoom數據。