两个外键引用一个表和可以为空的外键

Posted

技术标签:

【中文标题】两个外键引用一个表和可以为空的外键【英文标题】:Two foreign keys reference one table and null able foreign key 【发布时间】:2017-01-04 12:53:27 【问题描述】:

我是数据库表和关系的新手。我需要一些帮助来满足以下要求

工作流程

    1. Hospital will have Male Patient
    2. Hospital will have Female Patient
    3. Hospital Will have Couple Patient but in RegTable it will stored as separate record for male and female.

针对以上需求我设计了如下表结构

方法 1

正则表

+-------+---------+---------+
| RegID |  Name   | Gender  |
+-------+---------+---------+
|     1 | XXX     | M       |
|     2 | XXX     | M       |
|     3 | Husband | M       |
|     4 | Wife    | F       |
+-------+---------+---------+

注册细节

+----+------+-------+
| Id | FK_1 | FK_2  |
+----+------+-------+
|  1 |    1 | Null  |
|  2 |    2 | Null  |
|  3 |    3 | 4     |
+----+------+-------+

FK_1,FK_2 是 Regtable 中的 RegId

我有两个问题

    我目前的方法是否正确? 上述工作流程是否有替代方法。

请帮我解决这个问题。提前致谢

【问题讨论】:

【参考方案1】:

这里不需要2张表,如下图即可。

RegTables - this is the only table you need

Id int PK

Name string

Gender String 

PatientType tinyint 

您可以在此处维护enum Type 以分隔Singlecouple

public enum PatientType : byte
    
        Single=1,
        Couple =2,
    

更新:

Treatments table

Id int PK

Name string

RegId int FK --> this is the foreign key referencing RegTables table

【讨论】:

感谢 Sampath 的回答。但是我如何识别男性和女性属于夫妻。就像在 Reg 详细信息中一样,第 3,4 行将是一对 通过使用Type 枚举。如果是情侣,可以保存为1 +-------+---------+---------+ |注册号 |姓名 |性别 |输入 +-------+---------+---------+ | 1 | XXX |中号 | 0 | 2 | XXX |中号 | 0 | 3 |丈夫 |中号 |1 | 4 |妻子 | F |1 +-------+---------+---------+ 喜欢这个 对 我在上面做了一些小修改。我觉得现在更好了。Single你可以保存为1couple2 嗨 Sampath ,RegTable 将包含此列注册号 |姓名 |性别 |类型【参考方案2】:

我建议第三张表RegRecords 带有字段 id,注释,日期。它将包含一个注册数据,没有指向 RegTable 的链接。因此,您将在RegDetail 中存储指向真实人物的链接,该链接只有两个字段:FK_KEY_RegRecords 和 FK_KEY_RegTable。

【讨论】:

谢谢安德烈。能否请您简要解释一下。 我对 RegRecords 有疑问。使用 RegRecords 我将如何获取患者是否是 Couple。 从 RegDetail 组中选择 *,按 FK_KEY_RegRecords 的 count(*) > 1。

以上是关于两个外键引用一个表和可以为空的外键的主要内容,如果未能解决你的问题,请参考以下文章

获取请求导致父管理对象的外键为空

引用另一个模式的外键

SQL 在 Where 子句中处理可为空的外键

使用实体框架,如何在两个模型上添加外键以相互引用

如何使用主键作为JPA和Hibernate的外键引用?

Yesod / Persistent中的外键约束?