我在这里使用的是一个非常简洁的示例,所以请询问您是否需要更多的上下文。
我正在对数据库进行重组/规范化,其中大多数表中的ID字段都有主键字段,这些字段是自动递增的数字ID(1、2、3等)。我认为我需要将ID字段从数字值更改为从行中的数据生成的字符串值。
我对此的理由如下:
我有5张桌子;职员、成员、志愿者、实习生和学生;所有这些都有数字ID。
我有另一张名为BuildingAttendance的表,它在人们访问房屋时记录,以及出于什么原因,其中有以下相关字段:
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系统的其他表的记录的表?
发布于 2015-09-30 10:07:36
与字符串相比,自动递增的数字ids有几个优点:
您所面临的问题是您有一个超级类型的子类型。该信息应与该人一起保存,而不是保存在出勤记录中(除非一个人可以随每次访问而更改其类型)。在SQL中有几种方法可以解决这个问题,在编程语言中,没有哪种方法比简单的类继承更干净。
一种技术是将所有数据放在一个名为Persons的表中。这将具有唯一的id、类型和五个表中的所有列。问题是子表中的列在什么时候有很大的不同。
在这种情况下,有一个名为persons的表,它具有唯一的主键和公共列。然后为每个表都有单独的表,并使用PersonId作为这些表的主键。
这种方法的优点是可以使用外键引用Persons来获取类似于BuildingAttendance的内容。此外,还可以在适当的情况下为其他表提供对每个子类型的外键引用。
发布于 2015-09-30 10:50:11
戈登·林诺夫( Gordon )已经提供了一个答案,指出了类型/超级类型问题。我指的是一个类/子类,但这只是术语上的区别。
在这个区域有两个标签收集与类/子类相关的问题。下面是它们:
类表继承 共享主键
如果您将查看每个标记的info选项卡,您将看到一个简短的大纲。再加上问题的答案会帮助你处理你的案子。
通过使用自动编号ID创建一个名为Person的表,可以提供一种简便的方法来引用某个人,而不管此人的类型如何。通过使工作人员、成员、志愿者、学生和实习生表使用此ID的副本作为他们自己的ID,您将为您需要执行的任何连接提供便利。
是否将类型包括在出勤中的决定取决于您想要检索该人的当前类型的数据,还是使用该人员在出勤时的类型。
https://stackoverflow.com/questions/32862374
复制相似问题