Foreign-Key

這個有名字嗎?

  • September 24, 2019

這個有名字嗎?

我真的不知道如何描述這種情況,而且,這是一個設計缺陷嗎?

T4 有通往 T3 和 T1 的 FK,但我可以通過 T3 到達 T1。

T1、T2 指的是必須與 T4 引用的相同。

情況

這個有名字嗎?

冗餘外鍵冗餘引用

有關來自該網路的與此(某種)相關的實際案例查詢的隨機抽樣,請參見此處此處。

這是設計缺陷嗎?

也許?大概?如果我在審查時遇到它,我肯定會聞到一股程式碼味道。是否採取行動來改變它(或實施它)需要比目前文章中更多的資訊;並且可能出於“網際網路這麼說”之外的實際原因而這樣做。

TL; 博士:

可以做到。但你為什麼要?


正如評論中所指出的,提供範例 DDL 並使用模式通常有助於您自己了解它並幫助其他人更有效地響應。看看這個 DB Fiddle,看看它是否準確地代表了你想要描述的內容。

create table t1 (
 i int not null primary key
);
create table t2 (
 i int not null primary key
   foreign key references t1(i)
   on delete cascade
);
create table t3 (
 i int not null primary key
   foreign key references t2(i)
   on delete cascade
);
create table t4 (
 i int not null primary key
   foreign key references t3(i)
   on delete cascade
);
alter table t4
 add constraint fk_t4_t1
 foreign key (i)
 references t1(i);

如您所見,完全可以定義您描述的關係(至少在我的小提琴平台上),甚至可以強制執行級聯關係。但是…如果您嘗試將CASCADE操作應用於循環定義的關係,您可能會看到這一點(同樣,取決於您的平台)…

消息 1785 級別 16 狀態 0 第 1 行

在表 ’t4’ 上引入 FOREIGN KEY 約束 ‘fk_t4_t1’ 可能會導致循環或多個級​​聯路徑。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 約束。

…數據庫引擎會保護您免受自己的傷害;除非你在一些瘋狂的奇異 DBMS 中,比如CASCADE允許冗餘的PostgreSQL 。

如果您想視覺化適合這種模型的物化關係,它可能看起來像這樣……

select v.v, 
      t1.i t1, 
      t2.i t2, 
      t3.i t3, 
      t4.i t4
from (values (1),(2),(3),(4),(5)) v (v)
left join t4 on t4.i = v.v
left join t3 on t3.i = v.v
left join t2 on t2.i = v.v
left join t1 on t1.i = v.v;

…這可能表明…

+---+----+----+----+----+
| v | t1 | t2 | t3 | t4 |
+---+----+----+----+----+
| 1 | 1  | 1  | 1  | 1  |
| 2 | 2  | 2  | 2  | 2  |
| 3 | 3  | 3  | 3  |    |
| 4 | 4  | 4  |    |    |
| 5 | 5  |    |    |    |
+---+----+----+----+----+

還值得注意的是,前面的小提琴使用和X->X->X“交叉鍵”樣式映射(我已經看到“在野外”以合理的效果使用) - 儘管你的更嚴格地是……

X->X->X
↳-----⬏

如果實體真正不同,則對模型的另一種可能解釋是X->Y->Z專用鍵映射,如本小提琴所示,對沖突級聯有其獨特的反應。

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