DB的設計方法?Polymophic v.s. STI的用法?


#1

上次 jc 有提到幾個好用的 db 設計方式…
(e.g. nested tree…)

想請問的是…
⑴假設一個表格內自已又有多對多的父子關係,是要獨立再寫一個表?還是用什技巧…?
像 nested tree 是一對多…如果有點像 tags 有層級又有多對多的感覺,彼此有階層又可以交互…(只是舉個例)

⑵phlymophic & STI有比較實務的使用案例嗎?

謝謝


#2

(1) … 請先嘗試把你的需求寫清楚,看是否能合併之類的,或是針對問題分析,否則你的問題不明確,無法針對其做設計,我答什麼都不對

你可以外掛多對多對自己的表,拓樸是圖狀,類似

create_table :users
create_table :user_relations do |t|
  t.integer :from_user_id , :null => false
  t.integer :to_user_id , :null => false
end
add_index :user_relations , [:from_user_id , :to_user_id] , :unique => true

至於 model 的 relation 用 class 指定即可,而另外一種是樹狀 or nested set( 樹狀只需要 parent_id,nested set 其實也是樹狀,不過多 left & right )

create_table :user do |t|
  t.integer :parent_id
  t.integer :lft
  t.integer :rgt
end

,anyway 這堆一票幹法,必須視需求而定,甚至另外做一個 group 的表來抓 relation 都可以之類的,這邊請看 acts_as_tree / acts_as_nested_set 的 gem 就是(這兩個 gem 都是舊名的,有新的可替代,類似 awesome_nested_set )

(2) polymorphic 我們家很常用,類似交易列表,只管使用者進出交易,但交易來源可能是超商繳費,ATM,信用卡…而真正的來源可能是本站,廠商,後台管理用交易,所以來源的項目過多無法統一,就會用到,而如果用了 polymorphic 會希望做雙向資料的關連,也就是兩邊都要留 id,否則無法做反向參考

至於 STI 目前比較少用,類次多重合併單(同上面的一個單分為超商 / ATM / 信用卡,很類似但實作不同),另外一個就是我一直舉例的檔案上傳中的資料夾與檔案的問題,在上篇有寫還實作了

把資料夾和檔案歸為一類,之後就可以非常方便的來做分頁(資料夾在前檔案在後)其餘的…都是經驗了唄,以上