【问题标题】:Database moddeling | User M:M Appointment数据库建模 |用户 M:M 预约
【发布时间】:2016-10-10 07:21:53
【问题描述】:

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

Image of the database design

【问题讨论】:

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


    【解决方案1】:

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

    您有一个表,用户,其中包含医生和患者,并带有一个标志字段来区分他们。假设:该标志包含“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 字段可以被添加。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 两个表到 1 个新表的 1:m 关系。我明白了。但是我怎么称呼那个?除了 id 和外键,我还添加什么?
      • Gertjan,我通常用两个引用表的组合来命名这些表,即描述表用户和约会之间关系的表将称为 userappointment。所以你是说你可以在一次预约中拥有多名患者和多名医生。虽然这不是我在去看医生时通常看到的,但您仍然会在约会表中拥有所有 apt 特定的字段。 userappointment 表将包含特定于该人角色的任何内容,例如一名医生可能是首席医生。或者只是钥匙,就像你说的那样。
      猜你喜欢
      • 1970-01-01
      • 2018-07-14
      • 1970-01-01
      • 2013-07-08
      • 2012-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多