当前位置: 首页 > 面试题库 >

是否应该使用复合主键?

汤跃
2023-03-14
问题内容

在Java的JPA中(通过EmbeddedId或IdClass注释)似乎仅对复合数据库键提供第二类支持。当我阅读复合键时,无论使用哪种语言,人们都会碰到它们,因为这是一件坏事。但是我不明白为什么。如今,组合键是否仍然可以使用?如果没有,为什么不呢?

我发现一个同意我的人:http
:
//weblogs.sqlteam.com/jeffs/archive/2007/08/23/composite_primary_keys.aspx

但是另一个没有的人:http
:
//weblogs.java.net/blog/bleonard/archive/2006/11/using_composite.html

是我一个人,还是人们无法区分组合键是否合适?当表不代表实体时(即当它代表联接表时),我看到复合主键很有用。

一个简单的例子:

Actor { Id, Name, Email } Movie { Id, Name, Year } Character { Id, Name } Role { Actor, Movie, Character }

在这里,演员,电影和角色显然受益于将ID列作为主键。

但是角色是一个多对多联接表。我发现创建ID只是为了标识数据库中的一行没有任何意义。在我看来,主键显然是{ Actor, Movie, Character }。这似乎是一个相当有限的功能,特别是如果联接表中的数据一直在变化,那么一旦主键序列回绕为0,您就可能会遇到主键冲突。

因此,回到最初的问题,使用复合主键是否仍然可以接受?如果没有,为什么不呢?


问题答案:

我认为使用复合键没有问题。

对我来说,数据库本身就是一个组件,应该像对待代码一样对待它:例如,我们想要干净的代码,可以清楚地传达其意图,可以做一件事并且做得很好,不会添加任何内容不需要的复杂性等

与db相同,如果PK是复合的,则这是现实,因此模型应保持整洁。复合PK比混合自动增量+约束更清晰。当您看到没有任何作用的ID列时,您需要询问什么是真正的PK,您还应该知道其他隐藏的东西,等等。清晰的PK不会留下任何疑问。

数据库是您应用程序的基础,对我而言,我们需要可以拥有的最坚实的基础。在此基础上,我们将构建应用程序(是否通过网络)。所以我看不到为什么我们应该弯曲数据库模型以使其符合一种开发工具/框架/语言中的某些特定要求。数据在指导应用程序,而不是相反。如果ORM在将来发生变化并变得过时并且出现了强加另一个模型的更好解决方案,该怎么办?我们无法使用db模型来适应这个框架或那个框架,该模型应该保持不变,它不应该依赖于我们用来访问数据的工具…

如果将来更改数据库模型,则应该更改,因为功能已更改。如果今天我们知道此功能的变化方式,我们将对此进行建模。将来,任何将来的更改都将得到处理,例如,我们无法预测对现有数据的影响,因此,额外的一栏并不能保证它会撤销任何将来的更改…

我们应该针对当今的功能进行设计,并保持db模型尽可能简单,这样将来将来更改/发展就很容易。



 类似资料:
  • 问题内容: 考虑下面的示例表(假设SQL Server 2005): 我正在考虑一个复合主键,该主键包含两个product_id列(我肯定会想要一个唯一约束),而不是一个单独的唯一ID列。从性能的角度来看,问题是该主键是否应该集群? 我是否还应该在每个ID列上创建一个索引,以便更快地查找外键?我相信该表在读取方面比在写入方面会受到更多的打击。 问题答案: 正如其他一些人已经说过的那样,这取决于您如

  • AccessibilityService在系统的内存管理方面与普通服务有何不同? 我想问的是:系统可以为了节省内存而关闭AccessibilityService吗?如果可以,当您进入AccessibilityService时,您会看到它打开还是关闭?用户是否必须再次手动打开? 使用startForeground是否有助于使AccessibilityService保持活动状态? 在一个类似的问题中,

  • 问题内容: 在使用Linq to SQL时,对多对多关系表使用多列(复合)主键是否有益? 还是应该仅将身份列添加为非群集主键并适当地索引FK列? 问题答案: 不是LINQ问题。如果您的架构需要它们,请使用它们。如果您不这样做,请不要。无论哪种方式,LINQ都能很好地处理您的架构。 LINQ to SQL不能很好处理的一个领域是用于连接多对多关系的多列/键映射表,但是我不会说这严格属于您的问题解决的

  • 问题内容: 我正在创建一个新的SQL Server 2008数据库。我有两个相关的两个表。 第一个表如下所示: 第二张表如下所示: 每个品牌将至少具有一个型号,并且每个型号将仅属于一个品牌。 问题是,我应该像这样创建一个联结表吗? 还是我应该修改MODELS表以包括这样的BrandID 谢谢! 问题答案: 如果某个模型仅属于一个品牌,则可以在模型表上将FK放到该品牌上(您的第二种方法)。第一种方法

  • 在nextjs项目中,我把后端返回给我的access_token加密之后存储到了cookie里面 然后我设置httpOnly,但是当我想要在客户端axios里面去获得这个token的的时候,我拿不到。 我想要改变一下这个cookie的性质,改成客户端可以访问的。但是我看很多帖子说,这样不安全。 我现在有点犹豫,如果每次取得token还要发个网络请求去获得,那这个性能损失太大了,但是吧,我改成浏览器