我的联结表需要一个唯一的单一标识符以及另一个独立的复合标识符,该标识符由两个具有多对多关系的表的外键组成。其他问题似乎只在需要一个或另一个时解决。
我有:
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
哪个选项可以提供更好的性能(查询速度)?有什么显着差异吗?有没有更好的办法?
通常,我会将单个标识符作为主键,并声明该对是唯一的。
联结表可以表示实体以及关系。例如,“购买”是可以组合“客户”和“产品”但具有其自己的属性的联结表。
正如您所描述的那样,您有这样一个实体。该实体有两个非常重要的属性(应用程序和响应者)。这些属性具有非常重要的属性(它们是共同唯一的),因此它们应该被声明为unique
。
然后,如果将关系引用到别处,则可以使用主键作为外键关系 - 这将是单列。
根据你的描述,我建议:
application_instance_id
(respondent_id, application_id)
(application_id)
第三个索引可能不是必需的,因为Oracle支持索引中的跳过扫描。您可能希望在没有索引的情况下测试性能是否可接受。