我有以下数据库设计:
我想知道 EReportReq 是否必须将列作为主键, eReportReqId ,或者我可以使用 eReportId 和< strong> requirementId 为主键。
需求表将包含系统信息和 EReport 表(此处未显示), EReportReq 和 EReportReqImg 将拥有用户数据。
EReportReq 表示属于EReport的要求。要求可能是多个EReport的一部分。
EReportReqImg 表示属于EReport的那些要求的图像(一个或多个)。
我需要 eReportReqId 作为主键吗?
答案 0 :(得分:2)
假设EReport
无法多次连接到相同 Requirement
,{eReportId, requirementId}
无论如何都是的关键 。唯一的问题是:您是否需要附加代理键(eReportReqId
)? 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。