如何對多個表實施約束?
我有以下五個表:
- 產品
- 特徵
- 提供者
- PROVIDER_產品
- PROVIDER_FEATURE
邏輯如下:
泛型
PRODUCT
可以有一個或多個FEATURE
s。有不同PROVIDER
的 s 提供相同的產品,但細節不同,同樣FEATURE
的 s 也有不同的細節。問題是,有了這個 ERD,我可以用f1創建一個
PRODUCT
p1,用 f2 創建一個 p2 。然後我創建pv1。現在我可以用pv1 和p1 創建一個 pvp1。但是當我創建一個pvp1 時,我應該只被允許添加f1,因為這是通過錶鍊接到 p1 的那個。但是我也可以添加一個f2。FEATURE``PRODUCT``FEATURE``PROVIDER``PROVIDER_PRODUCT``PROVIDER``PRODUCT``PROVIDER_FEATURE``FEATURE``FEATURE``PROVIDER_PRODUCT``FEATURE
如何創建一個約束來阻止使用者輸入 a
PROVIDER_FEATURE
是 aFEATURE
的一部分,PRODUCT
但那不是aPRODUCT
的一部分?我需要在儲存過程中解決這個問題,還是有更優雅的方法來執行這個?PROVIDER_PRODUCT``PROVIDER_FEATURE
+-------------------+ +--------------------+ | | | | | PRODUCT +-----> | FEATURE | | | | | +---------+---------+ +----------+---------+ | | | | v v +-------------------+ +--------------------+ | | | | | PROVIDER_PRODUCT +-----> | PROVIDER_FEATURE | | | | | +-------------------+ +--------------------+ ^ | | +---------+---------+ | | | PROVIDER | | | +-------------------+
這可以通過使用重疊的級聯鍵輕鬆完成。這是使用 Oracle Data Modeler 的範例(請注意,此工具中存在錯誤或配置問題,因為 Provider_Feature 表應將每列顯示為 PF,表示 PK 和 FK):
在此範例中,提供者產品的 PK 包括提供的產品編號,而功能的 PK 包括該產品支持的功能編號。Provider_Feature 中的產品編號是返回到提供者產品和功能的 FK。因此,FK 約束阻止為尚未實例化為產品特徵可能性的產品特徵組合插入提供者特徵。
此解決方案假定功能由產品標識 - 即功能不能存在於產品上下文之外。這個假設可能是有效的,因為特性本身和它們本身對產品的上下文沒有意義。但是,如果您確實想要實例化可以包含在多個產品中的功能,那麼您只需添加一個 Feature 表並將目前 Feature 表設為 Product_Feature 表。
數據庫設計者經常假設每個表都必須有自己的“標識符”。沒有東西會離事實很遠。請參閱Fabian Pascal關於此主題的出色部落格文章。向每個表添加代理鍵意味著您嘗試執行的自然業務規則不再像您發現的那樣通過 PK 和 FK 約束以聲明方式執行。如果由於某種原因必須有 SK,則唯一的選擇是使用觸發器在程序上強制執行約束。這個選項問題更大。首先,您必須編寫、調試、測試和維護觸發器。面向數據庫專業人員的應用數學一書提供了關於使用過程邏輯以充分執行的方式表達約束的難度的詳細資訊。其次,當它們連續執行時,它們本身的觸發器有時會成為性能抑製劑。
我的建議是使用自然的聲明性方法。