先說明什麼是多態關聯。javascript
假設咱們有一張地址表,其中的地址多是對於User中的,也多是對於Orders中的。html
以上,只是舉個例子,實際的例子還有不少,好比咱們要設計一個內容管理系統(CMS),咱們的CMS有一個文章表,一個軟件表。還要求支持評論,那麼咱們的評論表的Id是引用文章表仍是引用軟件表呢?java
對於以上例子的缺點,貌似書本上有故意爲此多態關聯的模式走軟的嫌疑。缺點不說了,主要是查詢麻煩,其次不可以支持外鍵約束。git
交叉表數據庫
對於這種須要外鍵引用爲多個表的狀況,能夠創建一張交叉表。讓Address再也不依賴Orders或Users。數據庫設計
優勢:post
引用完整性支持。this
缺點:spa
若是咱們但願一個給定的地址,只可以在一張交叉表中出現一次,上面的複合主鍵已經作到了。若是但願一個地址能夠在一張交叉表中出現屢次,能夠取消複合主鍵。可是不可以保證一個地址不在多張交叉表中出現,這須要咱們再程序代碼中實現。設計
實際上,多態關聯與上篇文章提到的,實體-屬性-值有關係。
若是前面採用的是類表的設計,根本不會出現這個問題,上面的地址,也能夠依賴倒置。好比在Order表中添加一個AddressId、User表中添加一個AddressId解決。
假設,採用類表繼承的方法。直接將Address用外鍵指向基表就OK了根本就沒這個問題。書中的這一篇寫得有點莫名其妙。既然我已經寫完了,算了,無論了。