【问题标题】:How to create a ternary relationship that has a weak entity?如何创建具有弱实体的三元关系?
【发布时间】:2018-11-14 04:28:09
【问题描述】:

我正在开发一个系统,其中有doctorpatientdiagnosis。 我将diagnosis 设为一个弱实体,因为没有医生或患者就没有诊断。

现在我想在 doctorpatientdiagnosis 之间建立一个名为 treatment 的关系,其中特定的医生将治疗具有特定诊断的特定患者。

鉴于diagnosis 是一个没有自己的主键的弱实体,如何建立关系。

【问题讨论】:

  • 你为什么说diagnosis没有主键?
  • @TabAlleman 因为它是一个弱实体,所以主键将是它所依赖的另一个实体
  • 这与主键无关。根据您的问题,我们假设医生、患者和诊断都在不同的表格中。我认为您在这里混淆了主键和外键。访问表可以有访问ID、医生、患者和诊断。 visitid 是主键,其他列是引用患者、医生和诊断表(或任何您想要的)的外键。
  • 发布与此问题相关的(至少 4 个表)的 DDL。这会有所帮助。
  • @ahmednader 请编辑您的 Q 并为表格添加 DDL。

标签: sql-server database-design relational-database data-modeling


【解决方案1】:

我认为您对弱实体和主键的基本理解存在缺陷。

您似乎认为,因为弱实体表“包含”其他两个表的主键,这意味着它不能拥有自己的主键。

事实并非如此。主键可以是多列的组合,只要该组合对所有行都是唯一的。

根据你的描述,你应该有这样的东西:

Table Doctor
Primary Key:  DoctorID

Table Patient
Primary Key:  PatientID

Table Diagnosis
Primary Key:  DoctorID, PatientID (or an Identity column to form an artificial PK)
Foreign Key:  DoctorID References Table Doctor
Foreign Key:  PatientID References Table Patient

So finally, 

Table Treatment
Primary Key:  DoctorID, PatientID (, Identity column of Table Diagnosis if you created one)
Foreign Key:  DoctorID References Table Doctor
Foreign Key:  PatientID References Table Patient

如果医生只能对每位患者进行一次诊断,并且只能建议每位患者进行一次治疗,这就足够了。如果这些组合中的任何一个可以有多个实例,那么您应该在诊断和/或治疗表的 PK 中添加第三个“行号”类型列,以包含在该表的 PK 中并使其唯一。

【讨论】:

  • 很好,但我的意思是治疗将具有医生表中的医生 ID 和患者表中的患者 ID,所以我不需要诊断表中的相同 ID,你明白我的意思?
  • 是的,我明白你在说什么,你完全错了。患者和医生表中的 ID 唯一地标识了一个诊断,因此它们也唯一地标识了一种治疗。或者,正如我所说,您可以在诊断表中添加一个 IDENTITY 列,并在诊断表中引用该列而不是医生/患者 ID。
  • 啊好的我明白了,谢谢你的回答。它有帮助
  • 所以现在诊断是医生和病人之间的关系。诊断关系作为一个实体参与治疗关系。我说的对吗?
  • 是的,我相信你有它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多