2012-11-25 25 views
5

設置一個外鍵可以有一個常量而不是一個字段名?相關FK到STI子

因此,這裏是其中我發現是相當常見的,一旦你決定用STI(單表繼承)播放的場景。

你有一些基類型與各種子類型。

  • 人<(教師,學生,職員等)
  • 用戶<(會員,管理員)
  • 會員<(買方,賣方)
  • 車輛<(車,船,飛機)

有造型數據庫中的兩種主要方法:

  • 單表繼承
    • 一代大表的類型字段和一束可爲空的字段
  • 類表繼承
    • 每一個類型的表與共享PK(FK'd從孩子到父母)

雖然STI存在幾個問題,但是我想做的是,就像它可以減少你必須做的連接數量,以及Rails等框架中的一些支持,但是我遇到了一個問題如何關聯子類特定的表。

例如:

  • 認證應該只參考教師,人數
  • 型材應該只參考構件,用戶
  • WingInformation應該不會(除非你是蝙蝠俠可能與汽車或船)
  • 廣告是由賣方會員沒有買家會員國有

用C TI,這些關係都是微不足道的 - 只是拍打着相關表的外鍵,就大功告成了:

ALTER TABLE advertisements 
ADD FOREIGN KEY (seller_id) REFERENCES sellers (id) 

但隨着STI,類似的事情不會捕捉亞型限制。

ALTER TABLE advertisements 
    ADD FOREIGN KEY (seller_id) REFERENCES members (id) 

我想看到的是一樣的東西:

* Does not work in most (all?) databases * 
ALTER TABLE advertisements 
    ADD FOREIGN KEY (seller_id, 'seller') REFERENCES members (id, type) 

所有我已經能夠找到的是一個骯髒的黑客需要增加一個計算列相關的表:

ALTER TABLE advertisements 
    ADD seller_type VARCHAR(20) NOT NULL DEFAULT 'seller' 
ALTER TABLE advertisements 
    FOREIGN KEY (seller_id, seller-type) REFERENCES members (id, type) 

這讓我覺得很奇怪(更不用說不雅)。

真正的問題

是否有一個RDBMS在那裏,這將使我做到這一點?

這是不可能的原因嗎?

這僅僅是爲什麼不使用STI除了在最瑣碎的的情況下更多的原因?

回答

3

在外鍵聲明中沒有標準的方法來聲明一個常量。你必須命名列。

但你可能會迫使列有一個固定的值,使用下列方法之一:

  • 計算列

  • CHECK約束

  • 觸發INSERT/UPDATE之前用默認值覆蓋任何用戶提供的值。

+0

謝謝@Bill和是啊,我以前看過計算或檢查和觸發列的建議(因爲沒有我想要的標準)。你知道任何引擎允許我提到的語法(即使以一些非標準的方式)。 –

+0

對不起,我不知道。 –

相關問題