Django数据库设计 - 维护常见和历史数据

4
这更像是一个数据库设计问题,而不是一个具体的Django问题。
我们有一个小型的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模型,其中包含所有内容,直接将其与Conference模型链接,并在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"),)

或许还有更好的方法,我没有想到?欢迎提出建议。

谢谢, Victor


这是一个老问题,但我现在遇到了类似的情况,很高兴听到更多关于此事的意见(写作时还没有答案)。 - Aur Saraf
你打算使用Django管理应用程序来管理这些模型吗? - sul4bh
1个回答

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对象与其关联。最后,您可以创建Conference对象并将AccommodationRoom对象与其关联。
如果需要为同一AccommodationRoom再次提供新的BedAvailability设置,则可以创建一个新的BedAvailability对象,并将其与AccommodationRoom链接。即使BedAvailability规格发生更改,下一次会议也不需要重新输入AccommodationRoom数据。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接