【问题标题】:MySQL : One to One Relationship Tables MergingMySQL:一对一关系表合并
【发布时间】:2018-02-26 23:14:41
【问题描述】:

我正在尝试简化应用程序的数据库。在那个数据库中,我有两个表,比如说Patient 和MedicalRecord。我知道如果Table-A 中的任何给定行可以有at most 一行在Table-B 中,则据说两个表处于一对一关系(这意味着可以有零匹配)。

但就我而言,不是at most,而是exactly。即,Patient 中的每一行都应该有 exactly 在MedicalRecord 中的一行(没有病历就没有患者存在)。

Patient 表包含患者的所有个人详细信息,其 ID 为 PK。 MedicalRecord talbe 有他的血型、血红蛋白、bp 等详细信息,他的 ID 为 PK 和 FK 到 Patient。

我的问题是,我可以合并这两个表并创建一个表吗,

PatientDetails:personal_details 和血型、血红蛋白、bp 等

【问题讨论】:

  • 如果您的描述是正确的,那么从技术上讲,这两个版本都是您关系的有效表示,您可以合并它们。你甚至可以用 1:0 来做到这一点,因为你可以简单地将每个值都留空。出于逻辑原因,您将更多地将 1:1-realtions 拆分为单独的表。但我会检查你的原始假设。虽然血型通常不会改变,但我认为血压、血红蛋白等将取决于时间,因此您可能有不同时间的多个值(例如,如果同一位患者第二次就诊)。

标签: mysql database database-design


【解决方案1】:

“bp”=“血压”?那么您必须不合并这些表格。相反,它是 1:many - 每个患者可以有许多组读数。在读数中记录和绘制趋势非常重要。

在Patient 中只输入真正恒定的值——姓名、出生日期(不是年龄;计算一下)、性别、种族(某些种族比其他种族更容易患某些疾病),而不是身高体重。等等。

当然,患者可能会更改姓名(婚姻、法律诉讼等),但这是一个不影响架构设计的例外情况,除非强制您使用 patient_id,而不是 patient_name 作为唯一键。

每个患者都必须有一个MedicalRecord?那就是“业务逻辑”;在应用程序中测试它;不要依赖(在这种情况下)数据库中的任何内容。

两个表都有patient_id。 Patients 将其作为 PRIMARY KEY; MedicalRecord would haveINDEXed`。这就是拥有 1:many 所需要的一切。

在表格实际上是 1:1(可选 1:0/1)的情况下,我建议合并表格。 (也有例外。)

【讨论】:

  • 你能详细说明一下吗 => "bp" = "血压"?那么你不能合并表格。
  • 血压确实会发生变化,因此不应该是每位患者单行的一部分。
【解决方案2】:

如果两个表的共享列集具有相同的子行值集(SQL PRIMARY KEY 或 UNIQUE),那么您可以通过它们的自然连接替换这两个表。 (“自然连接”可能是您所说的“合并”,但这不是一个定义的技术术语。)每个原始表都将等于原始列上的连接投影。

(1:1 表示两边的总和,并不意味着 1:0-or-1,尽管大多数关于基数的文章都是草率且不清楚的。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-08
    • 1970-01-01
    • 2014-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多