這個有名字嗎?
這個有名字嗎?
我真的不知道如何描述這種情況,而且,這是一個設計缺陷嗎?
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
專用鍵映射,如本小提琴所示,對沖突級聯有其獨特的反應。