與沒有唯一/主鍵的表的關係
我有一個包含 3 個表的數據庫。
表
Work
,帶有一個名為 的欄位workName
。表
SubWorks
,其中有一個欄位subWorkName
並work
與之有關係Work.workName
。和表應該有關係的
Activity
欄位。superworkname``SubWorks.subWorkName
我無法創建這種關係,因為
SubWorks.subWorkName
它不是唯一鍵(或主鍵,它只是不出現在 phpMyAdmin 中),也不能因為它允許有多個SubWorks
同名,直到Work.workName
它們之間不同。我該如何解決這種情況?我正在考慮使用主鍵 int,但是如果有一天我進入溢出怎麼辦?假設我有這麼多作品要儲存,以至於我超出了極限?
我添加了一
ID
列,Activity
以便區分它們這就是我想要對關係做的事情:
我有一個
Work
名為R1
.3 SubWorks,命名為:
R1-1
,R1-2
,R1-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 列和/或較小的表,性能差異可以忽略不計。