两个外键引用一个表和可以为空的外键
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
以分隔Single
和couple
。
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
你可以保存为1
和couple
为2
嗨 Sampath ,RegTable 将包含此列注册号 |姓名 |性别 |类型【参考方案2】:
我建议第三张表RegRecords
带有字段
id,注释,日期。它将包含一个注册数据,没有指向 RegTable 的链接。因此,您将在RegDetail
中存储指向真实人物的链接,该链接只有两个字段:FK_KEY_RegRecords 和 FK_KEY_RegTable。
【讨论】:
谢谢安德烈。能否请您简要解释一下。 我对 RegRecords 有疑问。使用 RegRecords 我将如何获取患者是否是 Couple。 从 RegDetail 组中选择 *,按 FK_KEY_RegRecords 的 count(*) > 1。以上是关于两个外键引用一个表和可以为空的外键的主要内容,如果未能解决你的问题,请参考以下文章