【问题标题】:Database design with 2 m2m relationships具有 2 m2m 关系的数据库设计
【发布时间】:2013-08-25 12:54:42
【问题描述】:

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

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

更新:

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

【问题讨论】:

  • 好的,看起来你的设计已经完成了。如果这些“具有”关系中的任何一个是 m2m,那么将为您创建连接表,然后您就离开了。

标签: python database django database-design


【解决方案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)

【讨论】:

  • 我想我会试试你的第一个选项。我需要在 DiseaseState 中定义一个“通过”表吗?另外,这个中间表如何与 Option 链接?疾病有一个疾病状态,它有一个选项。一个选项有一个结果,一个结果有一个分配给它的值。希望能带来一点清晰
  • 我不这么认为,因为第一个选项提供 m2m 表的功能。
【解决方案2】:

由于我看不到你的整个类结构(疾病?状态?)我不能说得太具体,但我会尝试谈谈数据库设计。

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

tbl_person
id int(11)
name varchar(32)

现在我可以在 person 表中放置一个汽车列,但有些人驾驶不止一辆车。所以我会制作一张桌子,里面有汽车,并将每辆车与一个人联系起来(或关联)。

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

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

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

如果我将每辆车都放在一张桌子上,而每个人都放在一张桌子上,并且在他们之间有一个连接桌子,那就更好了。

所以我现在有tbl_person_car:

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

请注意,此表中的每一行仅包含两个Foreign KeysFKs。 此连接表包含 nothing 但执行连接所需的 FKs 非常重要。否则会危及整个数据库的参照完整性

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

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

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

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

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

这有意义吗? 希望对你有帮助。

【讨论】:

  • 感谢您的意见。澄清状态类结构是上面列出的疾病状态,疾病类只是疾病的列表。我认为这里需要一个中间表,因为我有一个与结果相关的值。我认为我需要将结果与选项联系起来,因为选项有结果。
猜你喜欢
  • 2021-11-07
  • 2011-04-05
  • 1970-01-01
  • 1970-01-01
  • 2011-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多