Python 具有2个m2m关系的数据库设计

Python 具有2个m2m关系的数据库设计,python,database,django,database-design,Python,Database,Django,Database Design,我想要一些关于如何进一步发展我的模型和表格的建议 该模型目前允许我保存链接到m2m关系中的疾病和状态的选项。如果我想保存结果,以及与状态、疾病和选项相关的价值,我将如何进一步构建它 例如,结果将具有与之关联的特定选项。选项将显示一个特定的状态,该状态将与特定的疾病相关。对于与特定选项关联的每个结果,都会为其指定一个值 我想我需要一个中间表,因为用户将分配给它的结果值。我对如何将结果和选项联系起来感到困惑,因为选项是m2m class Option(models.Model): disea

我想要一些关于如何进一步发展我的模型和表格的建议

该模型目前允许我保存链接到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.
更新:


为了澄清一点:一种疾病有一种疾病状态。疾病状态有一个选择。选择有结果。结果有一个赋值。选项和结果都是列表,用户可以从列表中进行选择。

我不完全确定我是否遵循,但您在这里有一些选项

第一种方法是手动创建结果和疾病状态之间的中间表

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从一个结果放到另一个选项

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

因为我看不到您的整个类结构(疾病?、状态?),所以我不能说得太具体,但我将尝试谈谈DB设计

我有一张桌子,上面有人,我想知道他们的名字,以及他们开什么样的车:

tbl_person
id int(11)
name varchar(32)
现在我可以在person表中添加car列,但是有些人驾驶不止一辆车。因此,我将制作一个包含汽车的表格,并将每辆汽车与一个人联系起来

tbl_car
id int(11)
car_name varchar(32)
person_id int(11)
这样,car表中的每一行都有一个person.id。这是一种
外键关系

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

如果我把每一辆车都放在一张桌子上,每个人都放在另一张桌子上,并且在它们之间有一个连接表,那就更好了

所以我现在有了
tbl\u person\u car

id int(11)
car_id int(11)
person_id int(11)
请注意,此表中的每一行仅包含两个
外键
FKs
。 非常重要的是,此联接表只包含执行联接所需的
FKs
,而不包含任何内容。否则将危及整个数据库的引用完整性

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

好的,如果这太简单了,很抱歉,但我希望它能解释,如果您认为联接表需要更多的数据,那么您的设计可能有问题

我建议您真正熟悉您的模型所做的工作,不要太担心数据库。当我开始使用Django时,我从DB方面考虑的太多了,这引起了一些痛苦

因此,在你的例子中,问问自己,“一种疾病有什么?”你可能会说“一种疾病有一个结果。有一个关系对于理解OO设计至关重要

例如,有一个选项是什么?它是一种疾病、患者、结果吗?不管它是什么,那么这可能就是结果所属的模型

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

谢谢您的意见。为了明确状态类结构是上面列出的DiseaseState,而疾病类只是一个疾病列表。我认为中间表在这里是必要的,因为我有一个与结果相关的值。我想我需要把结果和选项联系起来,因为选项有结果。我想我会试试你的第一个选项。我是否需要在DiseaseState中定义一个“through”表?另外,这个中间表如何与选项链接?一种疾病有一种疾病状态,它有一种选择。一个选项有一个结果,一个结果有一个赋值。我不这么认为,因为第一个选项提供m2m桌子的功能。好的,看起来你的设计完成了。如果这些“has a”关系中的任何一个是m2m,那么将为您创建连接表,您将退出。