2012-06-27 169 views
0

我有以下數據庫設計:A柱作爲主鍵或兩個外鍵爲主鍵

enter image description here

一種E-Report具有一個QAP具有一些Requirement秒。 A QAP及其Requirement s可用於多個E-Report

每個Requirement在每個電子報告中都會有一個是/否的確認。我添加了EReportReq來存儲需求確認值(用戶將設置這些值)。

而且,每個Requirement將在每個E-Report上具有多於一個的ImageEReportReqImg將存儲ImageRequirement的關係。

如果您需要該數據庫模型的更多詳細信息,請告訴我。

我的問題是關於EReportReq表。我不確定是否需要列作爲主鍵(EReportReqId),或者我可以使用eReportIdrequirementId作爲主鍵。

如果我使用這兩列,eReportIdrequirementId作爲主鍵,我將需要添加這兩條EReportReqImg表,所以我不知道這種方法比我的好。

您認爲如何?

回答

0

讓我們從這種狀態開始:

我需要添加這兩條EReportReqImg

在2 FK的普遍使用,因爲PK是不可更改的數據通常做法。因此,如果EReportReq不應該以您將其拖動到另一個requirementIdeReportId的方式進行更改,請使用複合鍵。否則,使用單值主鍵更健壯有效 - 因爲在此期間它不會被更改,因此您不需要寫入觸發器或使用棘手的級聯來更新子表。

審查其他選項的結果SQL的簡單,簡單比複合更好 - 寫INNER JOIN有2場是複雜的建設和有潛在的bug的地方,錯過的關鍵之一。

1

我的問題是關於EReportReq表。我不確定是否需要列作爲主鍵(EReportReqId),或者我可以使用eReportIdrequirementId作爲主鍵。

你可以使用它們中的任何一個 - 它們都不是絕對「更好」的。請注意,如果您決定使用第一種方法,請在{eReportId, requirementId}上創建一個UNIQUE約束。

拳頭辦法(非標識關係和代理鍵)導致:

  • 「精簡」外國在子表的鍵(這是EReportReqImg在這種情況下) - 因爲你已經注意到,
  • 級聯ON UPDATE不會傳播給子級(所以如果更新EReport.eReportId,只有EReportReq.eReportId級聯更新,但不是EReportReqImg.eReportId
  • 並且可能對ORM更友好。

在另一方面,第二種方法(以標識關係和自然鍵):

  • 具有潛在的JOIN不太需要(例如,你不需要EReportReqImg JOIN EReportReq只是爲了尋找出requirementId - 您可以直接把它在EReportReqImg.requirementId
  • 更適合clustered tables(如EReportReq行與同eReportId將被存儲在物理「接近」,這可能顯著受益一些查詢)
  • 避免了代理鍵上的額外索引。

由於您有少量的子表,「胖」FK並不重要,因爲我們正在處理ID,所以它們不可能發生變化,級聯ON UPDATE不太可能成爲問題。所以,我的本能是採用第二種方法,但是你可能有其他一些考慮可能會使你的決定朝不同的方向發展......