在联结表中,如果我需要一个唯一的唯一标识符和一个单独的唯一组合标识符,那么哪个应该是主键?

时间:2019-04-19 23:17:35

标签: sql oracle11g

我的联结表需要一个唯一的奇异标识符以及另一个单独的唯一复合标识符,该标识符由指向具有多对多关系的两个表的外键构成。其他问题似乎仅在需要一个或另一个时才解决。

我有:

APPLICATION表-保存有关应用程序类型的信息

- APPLICATION_ID NUMBER(38) PK

RESPONDENT表-保存有关用户的信息

- RESPONDENT_ID NUMBER(38) PK

APPLICATION_INSTANCE连接表-保存有关填写特定应用程序的特定用户的信息

- APPLICATION_INSTANCE_ID NUMBER(38) unique (PK?)
- APPLICATION_ID NUMBER(38) FK (PFK?)
- RESPONDENT_ID NUMBER(38) FK (PFK?)

用例:

1. A respondent can only fill out one application of each type
2. APPLICATION_INSTANCE also holds information like the status of an application and date submitted
3. Must be able to query knowing only the APPLICATION_INSTANCE_ID
4. MUST be able to find all applications of a given application type efficiently
5. MUST be able to find all applications of a given respondent efficiently

我看到两个选择(我倾向于第一个):

1. make APPLICATION_INSTANCE_ID PK and enforce a unique constraint between APPLICATION_ID and RESPONDENT_ID 
2. make APPLICATION_ID and RESPONDENT_ID a composite PK and make a unique index on APPLICATION_INSTANCE_ID 

哪个选项在什么时候可以提供更好的性能(查询速度)?有什么显着差异吗?有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

通常,我会将单个标识符用作主键,并声明该对是唯一的。

联结表可以表示实体也可以表示关系。例如,“购买”是一个联结表,可以将“客户”和“产品”组合在一起,但是具有自己的属性。

正如您所描述的,您拥有这样一个实体。实体具有两个非常重要的属性(应用程序和响应者)。这些属性具有非常重要的属性(它们是共同唯一的),因此应将其声明为unique

然后,如果该关系在其他地方被引用,则将主键用于外键关系-这将是单列。

根据您的描述,我建议:

  • 主键:application_instance_id
  • 唯一:(respondent_id, application_id)
  • 索引:(application_id)

由于Oracle支持索引中的跳过扫描,因此可能不需要第三个索引。您可能想测试一下,在没有索引的情况下性能是否可以接受。