代码之家  ›  专栏  ›  技术社区  ›  Gertjan Brouwer

数据库建模|用户M:M预约

  •  0
  • Gertjan Brouwer  · 技术社区  · 10 年前

    我创建了一个数据库模型,其中有一个用户实体,可以容纳医生和患者。这些将由“flag”属性分隔。下一个实体是保存约会的约会表。我面临的问题是我有一个多对多的关系。为了解决这个问题,我想添加另一个表,但我不知道我应该给这个命名,以及它应该包含什么信息。

    Image of the database design

    2 回复  |  直到 10 年前
        1
  •  1
  •   TommCatt Tony Andrews    10 年前

    你对信息很吝啬,所以我会做一些假设。即使假设在细节上是错误的,这个答案仍然有效。

    您有一个表Users,它包含医生和患者,并用Flag字段区分他们。假设:标记包含医生的“D”或患者的“P”。

    建议:在Users表上为组合ID和Flag创建唯一约束/索引。这将大大缓解以下数据完整性问题:

    • 可以在患者和医生之间预约,而不是另一个患者。
    • 另一方面,医生可能需要预约另一位医生作为患者(这是另一种假设)。
    • 但医生不应该与自己预约(以防止医生为患者安排傻瓜)。

    检测和预防这些问题的(触发器、存储过程和/或应用程序)代码可能会变得有点复杂,并且随着底层数据结构的不断发展,维护起来会很困难。这里有一个解决方案。

    create table Appointments(
        DrID      int   not null,
        DrFlag    char( 1 ),
        PatientID int not null,
        StartTime date  not null,
        EndTime   date,
        constraint ApptDrOnly check( DrFlag = 'D' ),
        constraint ApptDrSelf check( DrID <> PatientID ),
        constraint PK_ApptUserDoctor foreign key( DrID, DrFlag )
            references Users( ID, Flag ),
        constraint PK_ApptUserPatient foreign key( PatientID )
            references Users( ID )
    );
    

    由于Users表中ID和Flag字段的新唯一约束,FK可以使用交叉表中的DrID和DrFlag域将它们用作参考。DrFlag只能包含“D”的约束将此FK的目标仅限于医生。PatientID PK指的是Users表的PK,因此可以指医生或患者。检查DrID和PatientID不能相同会阻止医生自己预约。

    在那里,医生和患者(或其他医生)之间的预约涉及所有数据完整性问题,无需数据库或应用程序代码即可处理。

    如果某个假设是错误的,则进行相应的更改。例如,如果只能在定义为医生的用户和定义为患者的另一用户之间进行预约,则可以删除检查(DrID<>PatientID),并添加带有检查的PatientFlag字段(PatientFlag='P')。

        2
  •  0
  •   cdonner    10 年前

    您需要创建一个“userappointment”表,将用户链接到约会,一次一个。

    推荐文章