使用记录ID中的“实体类型编号”来标识实体

时间:2012-03-21 12:03:26

标签: database design-patterns database-design

我正在使用我公司的现成应用程序,供应商已经实现了一个有趣的数据库功能(众多功能之一)。我之前没有看到它在生产中使用过,我希望能够获得更多信息。

每个数据库表都指特定的实体类型。例如,TBL_PersonTBL_OrganisationTBL_Address。但是,对于每个表,ID始终以相同的数字组开始,例如,所有TBL_Address条记录均以1401开头,所有TBL_Person条记录均以1500开头。然后在此之后附加唯一部分。

从发展的角度来看,我所能看到的优点如下:

  • 这是一个庞大的数据库(大约600个表,其中许多表超过150列)。因此,如果在扫描表格时我找到WIdRIdLIdUnhelpfullyNamed_Id等列,我立即知道它所指的是什么(感谢他们的一个小程序还提供了您键入前四位数的位置,它会告诉您实体是什么以及在哪个表中找到它)
  • 他们在同一个表格中存储不同的实体变体 - 例如TBL_Vehicle记录可能是汽车(1234),卡车(2345),摩托车(3456),因此您不需要使用继承等,除非真的有必要

缺点(一般意义上说如果在其他地方使用过)可能是:

  • 使用表格设计鼓励懒惰 - 如果在同一个表格中存储多个实体类型,则为冗余列
  • 为看不清楚
  • 的开发人员添加了混淆

此设计模式/功能是否有术语?有没有其他众所周知的数据库实现这一点?还有其他不利之处吗?

2 个答案:

答案 0 :(得分:1)

在这样的例子中,首先经常有 NO 数据库设计。 一切都是在应用程序级别(可能是OO)上设计和实现的,然后在某个地方存储(持久化) - 在这种情况下是在数据库中。数据库只是一个“应用程序下的存储”。

在应用数据库设计的情况下,使用以数据为中心的模型。一旦完成,数据库可以“独立” - 不需要应用程序从数据中理解。

可能有也可能没有涉及ORM映射器,因此当涉及到那些大型表时,您可能会查找映射器实现的单表继承的结果。

答案 1 :(得分:1)

通过将两条信息合并到单个字段中,这种“设计”违反了atomicity的原则,因此违反了第一个普通形式。

逻辑上,通过使用复合主键{type, id}可以实现同样的目的。我猜测“合并”类型和id的决定是由他们的应用程序设计和希望拥有“简单”密钥驱动的。