我应该使用“自然ID”创建实体还是应该在每个实体中始终使用Long作为ID

MichałZiober

在我的职业生涯中,我看到了两种不同的设计,即如何在DB中建模业务对象:

  1. 始终使用Long作为实体的ID
  2. 选择最合适的。

现在,我们有了“资源”实体,可以从另一个服务下载该实体。每个资源都包含自然的内容ID-电子邮件(电子邮件只是一个示例,我们可以想象应该使用的其他情况String)。我想将其用作数据库中的主要ID。但是我的同事想创建其他属性Long-id。我不确定,为什么要创建此附加属性。当然,数据库模型更简单,因为所有实体都具有相同的结构,但是我更喜欢使用Stringid。

伙计们,您认为哪种模式更好?为什么?

约翰·史密斯

首先,我不确定是否假设电子邮件可以是“资源”的唯一自然ID,因为这意味着对于每个新资源,您都需要创建一个新电子邮件,并且资源无法读取电子邮件,但是我知道案例,所以可能是正确的。

因此,问题来了:

影响

  • 在每种情况下,数字ID都可以更快地查找。但是由于字符串也非常快(当使用适当的索引时),对于大多数应用程序来说,这可能就足够了。
  • 数字ID使用较少的空间(通常是最小的问题)
  • 在涉及异构系统的情况下,通常首选字符串ID(您可以在示例中看到:服务为“资源”提供字符串ID)。这样做的一个原因是它更容易调试,例如,用户可能只看一眼就可以看到所指的对象,另一个原因是字符串实际上是任何系统中最常见的分母(尽管存在编码问题,但^^)。
  • 如果您必须在数据库中执行大量手动工作,则可以更快地键入数字,因为字符串通常会更长
  • 如果您使用自然ID,则ID包含不止一列是一种很常见的情况。这使SQL语句更长,更容易出错,就像它使“对象关系映射器配置”更长,更容易出错一样。
  • 通常,您会有一些唯一的标识符(例如电子邮件),但可能会随着时间而改变(人们结婚^^)。在这种情况下,添加一些人工ID也是很常见的(同时具有两者)

在您的情况下,除了使用该字符串ID与该服务进行通信之外,您别无选择(?),因此至少也必须具有此选项。

因此,现在我个人的观点是:我认为,作为开发人员,您的工作量更少,数字ID的问题也更少,尽管调试起来有些困难。作为数据库管理员,如果只有一列,则它是String还是Long都没有关系,因为它不会使连接复杂化。只要字符串是不可变的,例如永不更改,就可以了。如果它可以更改,那么肯定会给您带来很多管理员的麻烦(而愚蠢的开发人员不会在乎^^)。如果它可能随时间变化,请使用数字ID。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Spring Rest API验证应该在DTO中还是在实体中?

我应该在JPA实体中编写equals()和hashCode()方法吗?

我应该在JPA2.0中使用基本体还是包装器?

您是否应该在Java中始终使用枚举而不是常量

我应该在使用Jackson时使用包装器还是原始类型作为字段

我们是否应该在Swift的闭包内部始终使用[unown self]

序列化逻辑应该在实体还是其他类中

我应该在实体框架模型的主键中使用int还是long吗

我应该在PostgreSQL 9.3中使用hash还是btree作为外键索引吗?

我应该在Angular指令中使用单个对象还是单个值作为属性?

我应该在Python 2.7中使用print语句还是函数?

DDD。我应该在存储库中修改实体吗?

我应该在SQLAlchemy中始终使用'implicit_returning':False吗?

我应该使用display:块,还是应该始终使用display:flex?

我应该使用开发者实体还是用户实体?

我应该在模型中的About页面使用什么,还是仅将其用作模板?

应该在DTO模型还是在目标实体模型中执行计算?

我应该在JSFiddle中使用:after还是:: after?

我应该在“ this”中使用bind还是关闭别名?

我应该在“ _id”中使用时间戳吗?

我应该在Ember中链接`get()`还是可以使用点表示法?

我应该在每个TestMethod中还是在ClassInitialize中设置模拟方法?

我应该在我的应用程序内使用Facebook用户ID吗?

实体框架-我应该在函数中还是在函数完成后编辑对象

为什么Rails使用id作为主键,我应该在其他列上建立索引吗?

我应该在POSIX shell中使用“ test”还是“ [”“]”?

我应该在哪里使用 'use' 在 php 中?

我应该在 Blender 中还是在 Unity 中使用子弹创建射击动画

我应该在 Android 上 Flurry 的新 GDPR API 中使用哪个 ID?