数据库moddeling |用户M:M约会

时间:2016-06-09 14:51:33

标签: database-design mysql-workbench database-schema

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

Image of the database design

2 个答案:

答案 0 :(得分:1)

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

您有一个表,即Users,其中包含具有Flag字段的Doctors和Patients,用于区分它们。假设:该标志包含医生的“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 )
);

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

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

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

答案 1 :(得分:0)

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