在表中插入一行,该行与另一个表的 PK 自动增量链接

本文关键字:PK 另一个 链接 插入 一行 | 更新日期: 2023-09-27 18:33:09

我有两个表

联系人表

  • 联系人 ID(PK 自动递增(
  • 姓氏
  • 地址

等。。

病床

  • 患者编号
  • 联系人ID (FK(

如何首先添加患者的联系信息,然后将该联系人 ID 链接到患者表当联系人 ID 自动递增时(因此直到创建行后才知道(

我还有其他桌子-医生,护士等这也链接到联系人表。

教师表

  • 教师证
  • 联系人ID (FK(

因此,所有联系方式都位于一个表中。

这是一个好的数据库设计吗?

还是最好将每个实体的联系信息放在其自己的表中。

所以像这样..

病床

  • 患者 ID(PK 自动递增(
  • 姓氏
  • 地址

医生表

  • 医生 ID(PK 自动递增(
  • 姓氏
  • 地址

在编程方面,只有一个插入语句更容易。例如。插入到患者值(Id、@Firstname、@lastname、@Address(

但我确实喜欢分开的联系表(因为它规范化了数据(,但它在插入之前不知道 contactID 是什么,并且可能还需要执行两个插入语句(我不确定该怎么做(

===

====

回复编辑 4

使用登录表,您还会有一个 userid(int PK( 列吗?例如

登录表UserId (int PK(, Username, Password..

用户名应唯一

在表中插入一行,该行与另一个表的 PK 自动增量链接

您必须首先创建联系人,然后在知道其主键后创建患者并使用您现在知道的 PK 引用联系人。或者,如果患者表中的 FK 可为空,您可以先使用 NULL 作为 ContactId 创建患者,创建联系人,然后更新患者,但我不会这样做。

外键约束的思想是被引用的行必须存在,因此被引用的行必须在引用它的行之前存在。

如果您真的需要能够为多个患者提供相同的联系人,那么我认为这是很好的数据库设计。如果关系实际上是一对一的,则无需将它们分成两个表。根据您的示例,您可能需要的可能是一个 Person 表,您可以在其中放置医生、教师和患者的所有常见属性。

编辑:我认为这是你真正追求的继承。在关系数据库中实现继承的样式很少,但这里有一个例子。

个人数据库设计

护士和医生中的 PersonId 是引用 Person 表的外键,但它们也是这些表的主键。

要插入护士行,您可以执行以下操作(SQL Server(:

INSERT INTO Person(FirstName) VALUES('Test nurse')
GO
INSERT INTO Nurse(PersonId, IsRegistered) VALUES(SCOPE_IDENTITY(), 1)
GO

编辑2:谷歌透露,mysql 中的SCOPE_IDENTITY()等效项是 LAST_INSERT_ID() [mysql doc]

编辑3:我不会将医生和护士分成他们自己的表格,以便列重复。在没有内部联接的情况下进行选择可能会更有效,但性能不应该是唯一的标准,尤其是在性能差异不那么明显的情况下。在很多情况下,您只需要普通人数据,因此您不必总是进行联接。将每个人放在同一个表中可以查找单个表中的人。在单个表中具有通用属性还允许您拥有医生,该医生也是患者,而不会重复任何数据。稍后,如果您想拥有更常见的属性,您还需要将它们添加到每个"派生"表中,我会向您保证,有一天您或其他人忘记在其中一个表中添加属性。

如果出于某种原因您仍然担心性能并愿意牺牲规范化来获得性能,另一种可能性是将所有人员列放在同一个表中,并且可能有一个类型列来区分它们,并且只有很多 null 列,以便所有护士列对于医生来说都是 null,依此类推。可以阅读有关继承实现策略的信息,以了解即使未使用实体框架。

编辑4:即使您目前没有任何特定于护士的列,如果将来有一点可能性,我仍然会为他们创建一个表。做一个内部连接是找到护士的一个很好的方法,或者你可以在 WHERE 子句中做到这一点(可能有十亿种方法可以做到这一点(。您可以在"人员"表中具有类型列,但这会阻止同一个人同时是医生和患者。此外,在我看来,单独的表格对于(未来的(开发人员来说更"严格",更清晰。

我可能会使 PersonId 在用户表中为空,因为您可能有用户不是组织中的实际人员。例如管理员或类似的服务用户。想想现实世界的实体(忘记外键和可为空值(,每个用户都绝对是组织的一部分吗?但这一切都取决于您和软件的要求。数据库设计应从实体关系设计开始,在该设计中,您可以弄清楚现实世界的关系,而不考虑它们将如何映射到关系数据库。这有助于您确定实际要求是什么。