【发布时间】:2016-10-10 07:21:53
【问题描述】:
我创建了一个数据库模型,其中有一个用户实体,可以容纳一个医生和一个病人。这些将由“标志”属性分隔。下一个实体是保存约会的约会表。我面临的问题是我有一个多对多的关系。为了解决这个问题,我想添加另一个表,但我不知道我应该给它取什么名字以及它应该保存什么信息。
【问题讨论】:
标签: database-design mysql-workbench database-schema
我创建了一个数据库模型,其中有一个用户实体,可以容纳一个医生和一个病人。这些将由“标志”属性分隔。下一个实体是保存约会的约会表。我面临的问题是我有一个多对多的关系。为了解决这个问题,我想添加另一个表,但我不知道我应该给它取什么名字以及它应该保存什么信息。
【问题讨论】:
标签: database-design mysql-workbench database-schema
你对信息很吝啬,所以我会做一些假设。即使假设在细节上是错误的,这个答案应该仍然有效。
您有一个表,用户,其中包含医生和患者,并带有一个标志字段来区分他们。假设:该标志包含“D”代表医生或“P”代表患者。
建议:在用户表上为 ID 和标志的组合创建一个唯一约束/索引。这将大大缓解以下数据完整性问题:
用于检测和防止这些问题的(触发器、存储过程和/或应用程序)代码可能会变得有点复杂,并且随着底层数据结构的不断发展,维护起来会很痛苦。这是一种解决方案。
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表的新唯一约束,FK可以使用交叉表中的DrID和DrFlag字段将它们用作参考。 DrFlag 只能包含“D”的约束将此 FK 的目标仅限于医生。 PatientID PK 指的是用户表的 PK,因此可以指医生或患者。 DrID 和 PatientID 不能相同的检查会阻止医生自行预约。
在那里,医生和患者(或其他医生)之间的约会,所有数据完整性问题都在没有数据库或应用程序代码的情况下处理。
如果假设是错误的,请进行相应的更改。例如,如果只能在定义为医生的用户和定义为患者的另一个用户之间进行预约,则可以删除检查 ( DrID PatientID ) 并且带有检查 ( PatientFlag = 'P' ) 的 PatientFlag 字段可以被添加。
【讨论】:
您将创建一个“userappointment”表,将用户链接到约会,一次一个。
【讨论】: