多型關聯

多型關聯(polymorphic association)是種除了一個index之外,還包含其他屬性的複合結構。這個複合結構會是一個 id + type 組成的,而這樣的設計能讓開發者彈性的與不同的 Model 建立關係,不用為新的關係額外建立一個外鍵。

這裡介紹 Rails 實踐多型關聯的方式,以下拿官方教學文件來當範例。圖片(Picture)的資料表紀錄了屬於員工(Employee)的照片和屬於產品(Product)的圖片。那麼該怎麼在圖片的資料表中取得產品A的所有圖片或員工B的所有照片呢?

答案就是要透過 Picture 的 imageable_id 和 imageable_type,以產品A為例,查詢時就是找到 imageable_id 是產品A的 id 且 imageable_type 是 Product 的字串,回傳所有產品A的圖片;員工B,就查詢 imageable_id 是員工B的 id 且 imageable_type 是 Employee 的字串,回傳所有員工B的照片。

source: rails guildline

優點與缺點

優點

  • 利於關聯不同的 Model,設計結構可以更加彈性
  • 適應於尚未確定的需求、情境

缺點

  • 使用複合索引,所以結構複雜
  • 不利於 join table 的查詢
  • 無法保證參考完整限制的特性

所謂參考完整限制(Referential integrity constraint)是指兩個資料表雖然彼此獨立,但一個資料表透過外鍵與另一個資料表的主鍵對應,讓兩方資料存在一種關係。如此移除某一邊 table 的紀錄,可以在其他 table 連帶找出與這筆有關聯的紀錄,一倂移除,修改也是一樣的,維持資料的一至性。

polymorphic 無法保證參考完整,就因為沒有外部鍵對應主鍵,因此,在如何維持一至性需要多作考量。

小結
polymorphic association 不適合的場景,就是放在資料查詢的中間層。所謂需要資料查詢的中間層的比方說 Product 和 Category,一個 product 可以有很多 category,category 也可以反向找出很多屬於他的 product,這種多對多關聯就沒有 polymorphic 的必要,因為 poly 後不利於 join table。相關討論

實作參考

Rails 實戰聖經/ 多型關聯
GoRails/ Comments With Polymorphic Associations

心得

目前還在自己的專案實作中,日後更新...


#polymorphic #多型關聯 #Referential integrity #參考完整性 #Rails #Model







Related Posts

[第九週] 從 PHP 連線到 MySQL 資料庫

[第九週] 從 PHP 連線到 MySQL 資料庫

Day02  深入了解 Lazy-load 的背後實作 - Intersection Observer API

Day02 深入了解 Lazy-load 的背後實作 - Intersection Observer API

出去玩行程

出去玩行程


Comments