Primary-Key

與沒有唯一/主鍵的表的關係

  • June 26, 2014

我有一個包含 3 個表的數據庫。

Work,帶有一個名為 的欄位workName

SubWorks,其中有一個欄位subWorkNamework與之有關係Work.workName

和表應該有關係的Activity欄位。superworkname``SubWorks.subWorkName

我無法創建這種關係,因為SubWorks.subWorkName它不是唯一鍵(或主鍵,它只是不出現在 phpMyAdmin 中),也不能因為它允許有多個SubWorks同名,直到Work.workName它們之間不同。

我該如何解決這種情況?我正在考慮使用主鍵 int,但是如果有一天我進入溢出怎麼辦?假設我有這麼多作品要儲存,以至於我超出了極限?


我添加了一ID列,Activity以便區分它們

這就是我想要對關係做的事情:

我有一個Work名為R1.

3 SubWorks,命名為:R1-1, R1-2R1-3與 R1 有關係。

和 2 Activity (ID: 1, 2),與 subWorkName 一起引用到R1-1. 還有另一個 ID 為 3 的活動,它使用 subWorkName 引用R1-2

我想,如果我刪除 R1: R1-1, R1-2,R1-3也將被刪除,並且他們的所有活動都將被刪除,因此活動 1 和 2 將被刪除。

現在,假設我刪除R1-1,活動 ID 1 和 2 也應該被刪除。

如果我刪除R1-2活動 ID 3 應該被刪除。

我已經完成了第一部分(如果我刪除了一個作品,SubWork 將隨之消失)但我對第二部分有疑問。

使用代理 ID 是一種方法,但您並非必須這樣做。如果你想保留你目前的設計——我想它Work (workName)作為主鍵和SubWork (workName, subWorkName)潛在的主鍵或唯一鍵,你可以Activity像這樣定義表(我也稍微改變了列名):

Work
--------
workName      PK


SubWork
--------
workName      PK ,  FK -> Work (workName)
subWorkName   PK


Activity 
-------- 
activityID    PK       -- or what other column you have as primary key
workName        FK1
subWorkName     FK1  
 FK1 (workName, subWorkName) -> SubWork (workName, subWorkName)

正如@raumkrieger 指出的那樣,要定義外鍵約束,您必須引用唯一或主鍵列(或列)。因為如果我們正確假設(workName, subWorkName)唯一標識SubWork表中的一行,您可以使用此組合來引用外鍵。


注意:我不建議使用長 varchar 列總是比使用窄代理整數列更好。特別是如果表很大(或計劃)和/或 varchar 列很寬,這將不是大多數 DBMS 中最有效的設計。但是對於窄 varchar 列和/或較小的表,性能差異可以忽略不計。

引用自:https://dba.stackexchange.com/questions/69013