新列作为主键或使用两个FK作为PK

时间:2012-09-13 13:25:24

标签: database-design primary-key composite-primary-key

我有以下数据库设计:

Pk

我想知道 EReportReq 是否必须将列作为主键, eReportReqId ,或者我可以使用 eReportId 和< strong> requirementId 为主键

需求表将包含系统信息和 EReport 表(此处未显示), EReportReq EReportReqImg 将拥有用户数据。

EReportReq 表示属于EReport的要求。要求可能是多个EReport的一部分。

EReportReqImg 表示属于EReport的那些要求的图像(一个或多个)。

我需要 eReportReqId 作为主键吗?

3 个答案:

答案 0 :(得分:2)

假设EReport无法多次连接到相同 Requirement{eReportId, requirementId}无论如何都是的关键 。唯一的问题是:您是否需要附加代理键(eReportReqId)? Here是可以帮助您做出决定的一些标准。

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

enter image description here

此模型允许在某些情况下减少JOIN。例如,只需扫描EReport - EReportReqImg已经存在就可以获得给定eReportId的所有图片,这样我们就可以直接使用它来过滤数据(而不是必须加入)使用EReportReq获取eReportId)。

它也很好地clusters索引中的数据(如果你的DBMS支持它,可能还有整个表),使得某些范围扫描非常有效(包括上面提到的那个)。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

作为旁注,如果您要概括它并使用FK作为主键,也许您应该考虑将EReportReqImg表规范化为EReportReq。