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

Database moddeling | User M:M Appointment

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

Image of the database design

您将创建一个 "userappointment" table 将用户链接到约会,一次一个。

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

您有一个 table 用户,其中包含医生和患者,并使用 Flag 字段区分他们。假设:该标志包含医生的 'D' 或患者的 'P'。

建议:在 Users table 上为组合 ID 和 Flag 创建一个 Unique constraint/index。这将大大缓解以下数据完整性问题:

  • 可以在患者和医生之间进行预约,而不能在其他患者之间进行预约。
  • 另一方面,一位医生可能需要预约另一位医生作为他们的病人(这是另一个假设)。
  • 但是医生不能和自己预约(防止医生忽悠病人)。

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

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 )
);

由于 ID 和 Flag 字段对 Users table 的新唯一约束,它们可以被 FK 使用交集 table 中的 DrID 和 DrFlag 字段作为参考. DrFlag 只能包含 'D' 的约束将此 FK 的目标仅限于医生。 PatientID PK 是指用户 table 的 PK,因此可以指医生或患者。检查DrID和PatientID不能相同,防止医生自己预约

在那里,医生和病人(或其他医生)之间的约会,所有数据完整性问题都在没有数据库或应用程序代码的情况下处理。

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