Python 您将如何建模此数据库关系?

Python 您将如何建模此数据库关系?,python,database,django,database-design,Python,Database,Django,Database Design,我正在django中为数据库关系建模,我想听听其他的意见。这种关系是一种二对多的关系。例如,一名患者可以有两名医生:主治医生和主治医生。医生显然有很多病人 应用程序确实需要知道哪个是哪个;此外,在某些情况下,一名患者的主治医生可能是另一名患者的主治医生。最后,主修课程和小学课程通常是相同的 起初,我想把两个外键从病人表放到医生表中。然而,我认为django不允许这样做。此外,仔细想想,这确实是一种多(二)对多的关系 因此,我如何在保持与患者相关的医师类型的同时,对与django的这种关系进行建模

我正在django中为数据库关系建模,我想听听其他的意见。这种关系是一种二对多的关系。例如,一名患者可以有两名医生:主治医生和主治医生。医生显然有很多病人

应用程序确实需要知道哪个是哪个;此外,在某些情况下,一名患者的主治医生可能是另一名患者的主治医生。最后,主修课程和小学课程通常是相同的

起初,我想把两个外键从病人表放到医生表中。然而,我认为django不允许这样做。此外,仔细想想,这确实是一种多(二)对多的关系

因此,我如何在保持与患者相关的医师类型的同时,对与django的这种关系进行建模?也许我需要在多对多关联表中存储医师类型

谢谢,
皮特我同意你的结论。我会将医生类型存储在多对多链接表中。

考虑使用多对多连接表。使用应用程序逻辑防止每个患者有两名以上的医生

Physician
    Physician_ID
    ...

Patient
    Patient_ID
    ...

Physician_Patient
    Physician_ID int not null
    Patient_ID int not null
    Type ENUM ('Primary', 'Attending')
    PRIMARY KEY (Physician_ID, Patient_ID)
    KEY (Patient_ID)

像这样的怎么样:

class Patient(models.Model):
    primary_physician = models.ForeignKey('Physician', related_name='primary_patients')
    attending_physicial = models.ForeignKey('Physician', related_name='attending_patients')

这允许您对同一型号使用两个外键;
医师
模型还将包含名为
初级患者
主治患者
的字段,这很有趣。我很高兴我问了。django确实错误地建议使用相关的名称。是的——这是因为,在没有“相关的名称”的情况下,医生将获得一个“病人集”的反向关系。但这会导致错误,因为这两个字段都会尝试创建“patient_set”反向关系。如果您有同一型号的外键,则必须指定“相关名称”以避免此问题。这将导致检索医生的患者列表时出现重复。应用程序将需要接受联合。只需说Patient.objects.filter(Q(主治医师=主治医师)| Q(主治医师=主治医师))。我认为这个模型是最好的方法,即使从原始模式的角度来看也是如此;它精确而自然地模拟了这种关系。(“Q”是1.1的新版本,它还没有发布,但我不会接近1.0;它缺少太多东西。我发现Django主干非常稳定,至少目前是这样。)@Glenn:Django至少从0.96版本开始就有Q-objects了()。您可能正在考虑F-objects,这是Django 1.1()中的新功能,您甚至可以在其中添加数据库级约束。Django的ORM层没有表示联接表的模型,这取决于您的DBMS。联接表是自动创建的,不能向其中添加额外的列。您可以使用ForeignKey字段创建一个模型,该字段可以在概念上表示联接表,并向该表中添加额外的字段,但在其他解决方案中,这会有点笨拙。确实如此。不过,我看不出有任何理由在这里使用M2M关系。常规外键就可以了。正如我所说:“您可以创建一个带有ForeignKey字段的模型,这些字段可以在概念上表示联接表,并向该表中添加额外的字段,但在其他解决方案面前,这会有点笨拙。”:)