数据库设计,2 m2m关系

时间:2013-08-22 16:48:01

标签: python database django database-design

我想就如何进一步开发我的模型和表格提出一些建议。

此模型目前允许我保存以m2m关系链接到疾病和状态的选项。如果我想保存结果以及它与状态,疾病和选项相关的相关价值,我该如何进一步建立这个?

例如,结果将具有与之关联的特定选项。选项将是一个特定的状态,它将具有与之相关的特定疾病。对于与特定选项相关联的每个结果,都会为其分配一个值。

我认为我需要一个中间表,因为用户将分配给它的结果值。我很困惑如何将结果与选项联系起来,因为选项是m2m。

class Option(models.Model):
    disease = models.ForeignKey(Disease)
    option = models.CharField(max_length=300)

class Outcome(models.Model):      
   disease = models.ForeignKey(Disease)
   outcome = models.CharField(max_length=200)

class DiseaseState(models.Model):
   state = models.CharField(max_length=300)
   disease = models.ForeignKey(Disease)
   option = models.ManyToManyField(Option, blank=True)
   #outcome = models.ManyToManyField(Outcome, blank=True) #will adding this solve my use case? It does not seem like outcome will link to option.

更新

为了清楚起见:疾病有疾病状态。 DiseaseState有一个选项。期权有结果。结果具有分配给它的值。 Option和Outcome都是列表,用户可以从列表中选择。

2 个答案:

答案 0 :(得分:1)

我不完全确定我会关注,但你有几个选择。

第一种是在Outcome和DiseaseState之间手动创建中间表

class DiseaseStateOutcome(models.Model):
    unique_together = (('disease_state', 'outcome'),)

    disease_state = models.ForeignKey(DiseaseState)
    outcome = models.ForeignKey(Outcome)

    #option foreign key, or m2m relation to option here

您的另一个选择是,如果您只想要一个与疾病状态/结果对相关的选项,那就是将一个ForeignKey从Outcome到Option。

class Outcome(models.Model):
    #Your other fields here
    option = models.ForeignKey(Option)

答案 1 :(得分:1)

因为我看不到你的整个班级结构(疾病?,状态?)我不能太具体,但我会尝试谈谈数据库设计。

我有一张桌子可以容纳人,我想知道他们的名字,以及他们驾驶的车型:

tbl_person
id int(11)
name varchar(32)

现在我可以在人员表中放置一个汽车列,但有些人驾驶不止一辆汽车。因此,我将制作一张带有汽车的桌子,并将每辆车与一个人连接(或关联)。

tbl_car
id int(11)
car_name varchar(32)
person_id int(11)

这样汽车表中的每一行都会有一个person.id。这是Foreign Key关系。

现在问题是我的汽车表中会有一堆列有重复数据的列,因为那里会有很多丰田,例如。

如果我把每辆车都放在一张桌子上,而另一个人在另一张桌子上加上加入表,那会更好。

所以我现在有tbl_person_car

id int(11)
car_id int(11)
person_id int(11)

请注意,此表格中的每一行只包含两个Foreign KeysFKs。 此连接表包含,但执行连接所需的FKs非常重要。如果不这样做会危及整个数据库的参照完整性

当然,只要您在模型中使用ManyToMany字段,Django就会为您构建此连接表。所以你永远不必担心它(这很好,因为一个错误的举动会破坏一切)。

好的,对不起,如果那太初级了,但我希望它能解释一下,如果您认为您的联接表需要更多数据,那么您可能会遇到设计问题。

我建议您对模型正在做的事情感到满意,并且不要太担心数据库。当我开始使用Django时,我从DB方面思考的太多了,它引起了一些痛苦。

所以在你的情况下,问自己,“疾病是什么?”您可能会说“疾病结果”。 具有关系对于理解OO设计至关重要。

它是什么,例如选项?它是疾病,患者,结果吗?无论它是什么,那么这可能是结果所属的模式。

这有意义吗? 我希望它有所帮助。