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

复合主键

闾丘霖
2023-03-14
问题内容

我正在设计一个数据库,该数据库将用于存储来自许多不同来源的数据。我存储的实例由原始来源分配了唯一的ID。我存储的每个实例都应包含有关其来源的信息,以及与此来源相关联的ID。

作为示例,请考虑说明该问题的下表:

----------------------------------------------------------------
| source_id | id_on_source | data                              |
----------------------------------------------------------------
| 1         | 17600        | ...                               |
| 1         | 17601        | ...                               |
| 2         | 1            | ...                               |
| 3         | 1            | ...                               |
----------------------------------------------------------------

请注意,尽管id_on_source每个来源的唯一,但有可能在id_on_source不同来源中找到相同的来源。

我对关系数据库有一个不错的了解,但是与专家甚至是经验丰富的用户都相去甚远。我在此设计中面临的问题是应该用作主键。数据似乎决定使用的复合主键(source_id, id_on_source)。经过一番谷歌搜索之后,我发现了一些关于复合主键优缺点的激烈争论,这让我有些困惑。

该表将与其他表具有一对多关系,因此将在其他表的外键中引用。

我并不局限于某个特定对象RDBMS,也不确定出于争论的目的它是否重要,但是可以说我更喜欢SQLite和and一起工作MySQL

在这种情况下使用复合外键有什么优缺点?你更喜欢哪个?


问题答案:

我个人觉得复合主键很痛苦。对于希望加入“源”表的每个表,都需要同时添加source_id和id_on_source字段。

我将在您的源表上创建一个标准的自动递增主键,并在source_id和id_on_source列上添加唯一索引。

然后,这允许您仅将源表的ID添加为其他表上的外键。

通常,我还发现许多框架和工具产品中对复合主键的支持充其量只是“修补”而在其他框架中则不存在。



 类似资料:
  • 问题内容: 我的JPA模型中有以下类(省略了getters,setters和无关字段): 我需要定义一个类,使得当从所述类生成DDL时,相应的表的主键被由密钥和。我尝试了以下方法: 但这会为表生成以下内容: 请注意,和都是可为空的,当我尝试将DDL加载到SQL Server时会导致以下错误 无法在表“ PRICE”中的可为空的列上定义PRIMARY KEY约束 我不明白为什么这些可以为空,因为在域

  • 我在使用复合主键的hibernate实体集时遇到了问题。 我们的应用程序中有一个概念“Target”。目标id应该是其他三个表(实体)主id的组合。目标也有一个int标记。员工应该有一系列目标。SQL如下所示: 这个SQL工作正常,它允许我每个role_id(员工)多个目标,只要应用程序和项目分类不同。 这是目标ID类 这是目标类 这是employee类,我想在其中为每个员工存储一组目标。 通过h

  • JFinal ActiveRecord 从 2.0 版本开始,采用极简设计支持复合主键,对于 Model 来说需要在映射时指定复合主键名称,以下是具体例子: ActiveRecordPlugin arp = new ActiveRecordPlugin(druidPlugin); // 多数据源的配置仅仅是如下第二个参数指定一次复合主键名称 arp.addMapping("user_role",

  • 问题内容: 我正在使用带有注释的Hibernate(在spring),并且我有一个对象,该对象具有有序的多对一关系,该对象的子对象具有复合主键,该子对象的一个​​组成部分是返回到该对象的外键。父对象的ID。 结构看起来像这样: 我尝试了各种注释的组合,但似乎都不起作用。这是我能想到的最接近的: 经过长时间的实验后,我得出了这一结论,在该尝试中,我进行的其他大多数尝试都产生了由于各种原因甚至无法加载

  • 我在jpa/Hibernate中映射复合键时遇到了问题。父实体和子实体都具有复合主键。 在运行时保存它时会出现以下异常: 我认为这是虚假的,因为有getter和setter。如果在priceRequestLegModel上使用mappedby=“leg”,在allocationModel上使用@mapsid,也会出现同样的错误。有人能指出我在这里做错了什么吗?

  • 我很难在Hibernate中映射复合主键连接。下面是我的模式的简化图片。请注意,我不能更改架构。 简化模式 引用com.corp.activity.tree的referencedColumnNames(id)未映射到单个属性 如何在Hibernate中构建这样的关系?我必须映射到单个属性(id),尽管主键是复合的。