数字 ID 与字符串 ID

Numeric IDs vs. String IDs

我在这里使用了一个非常精简的示例,所以请询问您是否需要更多上下文。

我正在处理 restructuring/normalising 一个数据库,其中大多数 table 中的 ID 字段都有主键字段,这些字段是自动递增的数字 ID (1,2, 3 等),我想我需要将 ID 字段从数值更改为从行中的数据生成的字符串值。

我的推理如下:

我有5个table;员工、会员、志愿者、实习生和学生;所有这些都有数字 ID。

我有另一个名为 BuildingAttendance 的 table,它记录人们访问场所的时间和原因,其中包含以下相关字段:

ID    Type    Premises    Attended

区分工作人员和会员。我使用类型字段,成员使用 MEM,员工使用 STA,等等。举个例子:

ID    Type    Premises      Attended
1     MEM     Building A    27/6/15
1     STA     Building A    27/6/15
2     STU     Building B    27/6/15

我认为使用类似于以下的 ID 可能是一个更好的设计设计:

ID       Premises      Attended
MEM1     Building A    27/6/15
STA1     Building A    27/6/15
STU2     Building B    27/6/15

处理这个问题的最佳方法是什么?我知道如果我的主键是一个字符串,我的查询性能可能会受到影响,但这比拥有 2 列更容易吗?

tl;dr - 我应该如何处理引用来自具有相同 ID 系统的其他 table 的记录的 table?

自动递增的数字 ID 与字符串相比有几个优点:

  • 它们更容易实施。为了生成字符串(如您所愿),您需要实施触发器或计算列。
  • 它们占用固定数量的存储空间(可能是 4 个字节),因此它们在数据记录和索引方面效率更高。
  • 它们允许成员在类型之间进行更改,而不影响密钥。

您面临的问题是您拥有超类型的子类型。此信息应与 一起存储,而不是在出勤记录中(除非一个人可以在每次访问时更改其类型)。在 SQL、none 中有几种方法可以像编程语言中的简单 class 继承一样干净。

一种技术是将所有数据放在一个名为 Persons 的 table 中。这将有一个唯一的 ID、一个类型,以及来自您的五个 table 的所有列。问题是当您的子 table 的列非常不同时。

在这种情况下,有一个 table 具有唯一主键和公共列的人。然后为每个单独的 tables 并使用 PersonId 作为这些 tables 的主键。

这种方法的优点是您可以为 BuildingAttendance 之类的内容提供对 Persons 的外键引用。并且,您还可以在适当的情况下为其他 table 提供对每个子类型的外键引用。

Gordon Linoff 已经提供了指出 type/supertype 问题的答案。我将其称为 class/subclass,但这只是术语上的差异。

此区域有两个标签收集与 class/subclass 相关的问题。他们在这里:

如果您查看每个标签的信息选项卡,您会看到一个简短的大纲。再加上问题的答案将有助于您处理案件。

通过创建一个名为 Person 的 table,使用自动编号 ID,您可以方便地引用一个人,而不管这个人的类型。通过让员工、会员、志愿者、学生和实习生 table 使用此 ID 的副本作为他们自己的 ID,您将方便您需要执行的任何加入。

关于是否包含出勤类型的决定取决于您是要检索具有人员当前类型的数据,还是要使用人员在出勤时的类型。