0

我有以下数据库设计:

PK

我想知道EReportReq是否必须有一个列作为主键eReportReqId,或者我可以使用eReportIdrequirementsId作为主键

Requirement表将有系统信息和EReport表(此处未显示),EReportReqEReportReqImg将有用户数据。

EReportReq表示作为 EReport 一部分的需求。一个需求可能是多个 EReport 的一部分。

EReportReqImg表示作为EReport一部分的那些需求的图像(一个或多个)。

我需要eReportReqId作为主键吗?

4

3 回答 3

2

假设一个EReport不能多次连接到同一个 ,无论如何都是一个关键。唯一的问题是:您是否需要额外的代理键 ( )?以下是一些可能有助于您做出决定的标准。Requirement{eReportId, requirementId}eReportReqId

我个人的直觉是,这个问题的答案是“不”,所以你最终会得到这样的模型:

在此处输入图像描述

在某些情况下,此模型允许较少的 JOINing。例如,只需扫描-EReport就可以满足获取所有给定的图像,因此我们可以直接使用它来过滤数据(而不是仅仅为了获取JOIN )。EReportReqImgeReportIdEReportReqeReportId

它还可以很好地将索引中的数据聚集在一起(如果您的 DBMS 支持它,可能还有整个表),从而使某些范围扫描非常有效(包括上面提到的那个)。

于 2012-09-13T18:09:11.327 回答
0

不需要eReportReqId 作为表的主键,但在某些情况下,您希望它拥有自己的主键。

于 2012-09-13T13:29:37.817 回答
0

这取决于 EReportReq 中的FK。如果 FK 的eReportIdrequirementsId的组合在EReportReq中必须是唯一的,那么您当然可以对其进行概括,并将 FK 用作 EReportReq 的主。否则,您将需要一个单独的列(即eReportReqId)作为主键。

附带说明一下,如果您要对其进行概括并使用 FK 作为主键,也许您也应该考虑将 EReportReqImg 表规范化为 EReportReq。

于 2012-09-13T13:39:37.493 回答