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

在什么情况下我们需要在数据库中使用复合键

常永长
2023-03-14
问题内容

我已经看到我们可以拥有复合键,其中主键由两个表的组合主键组成。

喜欢的人和书

person_id and book_id will make the primary key.

但我想问的是,我们需要对编程语言进行硬编码

我的意思是可以,我可以有任意名称的单独列作为主键,然后我不必对其进行硬编码,并且可以像平常一样执行我的功能

id,person_id ,book_id

问题答案:

在“新”应用程序中不应考虑使用组合键。过去,曾经有人认为“业务密钥”比“代理密钥”更好。

编辑:按照克里斯的要求,我正在扩大答案。

首先,我要说明我将这个问题理解为“复合主键”与“代理键”。

另外,我也承认在 一个
用例中复合键很有意义:在交叉引用表(也称为“链接表”)中。这些用于多对多表,仅包含两个字段,两个外键均构成外部参照表的主键。例如,UserRole表将包含user_idrole_id,仅此而已。例如,对于Java这样的表,没有类表示形式。通常是a
@ManyToManyCollection两边都有a 。

我在另一个答案(Hibernate:CompositePKvsSurrogatePK中的观点)中分享了我对Natural键与Surrogate键的看法,并且我相信Composite键在没有带来任何实际好处的情况下也具有Natural键的一些缺点。

复合键的问题在于,您将需要_两个_值来唯一地标识一条记录。一旦开始拥有引用该第一个表中的记录的表,这将成为一个问题。然后,第二个表需要
列才能引用 一条 记录。并且,如果第二个表使用由单个值+外键组成的复合键,则您现在具有 列来唯一地标识 一条 记录。第三张表将需要这 三_列额外的列,以仅引用第二张表中的 _一条 记录。真的,这是雪球。

另一个缺点是需求 确实会 发生变化。每时每刻。因此,今天看来是好的组合键并不是明天的所有键。这就是我们拥有替代钥匙的原因:要面向未来。

复合键主要用于使表中的记录基于一组列而唯一。例如,如果您有一个Customers表,则可能有一个NationalId+Country作为唯一值,这意味着如果两个用户所在的国家/地区是美国,则两个用户不能共享相同的SSN。但是,如果两个记录不在同一国家/地区,则它们的编号可能相同。如果您喜欢组合键,那么这将是一个不错的选择。但是正如我之前所暗示的,您可以使用代理键并应用unique约束。您将拥有复合钥匙的优势以及代理钥匙的安全性。



 类似资料:
  • 本文向大家介绍为什么我们需要一个数据库,包括了为什么我们需要一个数据库的使用技巧和注意事项,需要的朋友参考一下 数据库是数据的集合,通常以电子形式存储。数据库的设计通常是为了使其易于存储和访问信息。 好的数据库对任何公司或组织都至关重要。这是因为数据库存储了有关公司的所有相关详细信息,例如员工记录,交易记录,工资详细信息等。 数据库重要的各种原因是- 管理大量数据 数据库每天存储和管理大量数据。使

  • 问题内容: 基数实际上是什么意思?我们为什么需要它? 问题答案: 您可能并不总是希望将整数解析为以10为底的数字,因此提供基数可以指定其他数字系统。 基数是一位数字的值数。十六进制为16。八进制为8,二进制为2,依此类推… 在该函数中,您可以执行一些操作来提示基数而不提供基数。如果用户输入的字符串与其中一个规则匹配,但没有明确规定,则这些方法也可能对您不利。例如:

  • 问题内容: 我将稍微解释一下我的脚本,以便您可以理解我的问题。 基本上我做了一个脚本来检查SOCKS5是还是。 当我在上面测试我的脚本时,它运行良好,但是当我在Windows上对其进行测试时,直到我将以下行添加到: 谁能向我解释为什么我在Windows中需要此行,而在Linux服务器上却不需要? 问题答案: SSL证书上的此cURL手册页介绍了连接到SSL / TLS受保护主机时 证书验证 的过程

  • 当对部署/实时应用程序进行任何更改时,我们需要“重启”JBoss服务器的情况是什么? 即 -如果只是热交换一些(. js/. css/. jsp)文件完成。 -如果一些类被替换。 -如果我替换完整的. war文件。 ...等等。

  • 问题内容: 我正在学习CopyOnWriteArrayList类。 复制新阵列的目的是什么? 是其他线程读取数组吗? 因此,如果系统具有高并发性,并且大多数线程的操作都在读取而不是写入,那么最好使用。 问题答案: 如该链接所述: CopyOnWriteArrayList是Java 5并发API中引入的并发Collection类,以及它在Java中流行的表亲。 工具列表界面类似,并且但它的一个线程安

  • 问题内容: 因此,通过阅读一些文章,我得到的信息是能够实时修改字段并为类设置值,而无需重新编译。 所以有可能对没有源代码的第三方Java库创建的类执行此操作/是否可以在运行时使用反射来修改类实例? 在其他哪些情况下,通常还会使用反射? 我试图了解反射如何适用。 问题答案: 任何时候您在运行时处理字符串,并希望将该字符串的一部分视为语言中的标识符。 远程过程调用-将通过网络接收的消息的一部分视为方法