首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数字ID与字符串ID

数字ID与字符串ID
EN

Stack Overflow用户
提问于 2015-09-30 09:19:20
回答 2查看 2.1K关注 0票数 3

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

我正在对数据库进行重组/规范化,其中大多数表中的ID字段都有主键字段,这些字段是自动递增的数字ID(1、2、3等)。我认为我需要将ID字段从数字值更改为从行中的数据生成的字符串值。

我对此的理由如下:

我有5张桌子;职员、成员、志愿者、实习生和学生;所有这些都有数字ID。

我有另一张名为BuildingAttendance的表,它在人们访问房屋时记录,以及出于什么原因,其中有以下相关字段:

代码语言:javascript
复制
ID    Type    Premises    Attended

区分工作人员和成员。我使用类型字段,成员使用MEM,员工使用STA等等。

代码语言:javascript
复制
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可能是一个更好的设计设计:

代码语言:javascript
复制
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系统的其他表的记录的表?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-30 10:07:36

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

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

您所面临的问题是您有一个超级类型的子类型。该信息应与该人一起保存,而不是保存在出勤记录中(除非一个人可以随每次访问而更改其类型)。在SQL中有几种方法可以解决这个问题,在编程语言中,没有哪种方法比简单的类继承更干净。

一种技术是将所有数据放在一个名为Persons的表中。这将具有唯一的id、类型和五个表中的所有列。问题是子表中的列在什么时候有很大的不同。

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

这种方法的优点是可以使用外键引用Persons来获取类似于BuildingAttendance的内容。此外,还可以在适当的情况下为其他表提供对每个子类型的外键引用。

票数 3
EN

Stack Overflow用户

发布于 2015-09-30 10:50:11

戈登·林诺夫( Gordon )已经提供了一个答案,指出了类型/超级类型问题。我指的是一个类/子类,但这只是术语上的区别。

在这个区域有两个标签收集与类/子类相关的问题。下面是它们:

类表继承 共享主键

如果您将查看每个标记的info选项卡,您将看到一个简短的大纲。再加上问题的答案会帮助你处理你的案子。

通过使用自动编号ID创建一个名为Person的表,可以提供一种简便的方法来引用某个人,而不管此人的类型如何。通过使工作人员、成员、志愿者、学生和实习生表使用此ID的副本作为他们自己的ID,您将为您需要执行的任何连接提供便利。

是否将类型包括在出勤中的决定取决于您想要检索该人的当前类型的数据,还是使用该人员在出勤时的类型。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32862374

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档