2013-05-19 60 views
-1

我有兩個型號FUTUREMAPMILESTONE我應該使用STI還是多態模型?

FUTUREMAP

class Futuremap < ActiveRecord::Base 
    attr_accessible :name 
    has_many :milestones 
end 

MILESTONE

class Milestone < ActiveRecord::Base 
    attr_accessible :description, :type 
    belongs_to :futuremap 
end 

的是不同類型的里程碑,工作,高中,大學和現在的我通過屬性type告訴他們不同。但這不是一個好設計。

這是因爲我發現我需要在類型爲工作時存儲信息,在其學院時不需要存儲信息。

我應該製作不同類型的子類還是使Milestone成爲多態模型?我怎樣才能做出更好的設計,歡迎任何建議或想法。

+0

這個設計你不喜歡什麼? –

+0

@SergioTulentsev,不同類型有不同的屬性。工作有mabye五個屬性和學院可能有3. – SHUMAcupcake

+0

我讀過一次,有人寫了一個文字處理器,「四書剛」書。該程序比實際的機械打字機慢。所以不要過度設計:) –

回答

2

如果各個里程碑之間存在相當數量的通用性,單表繼承(STI)對於這類事情非常有用。在太字節大小的硬盤驅動器時代,我真的不會擔心所有時間都不能使用所有的字段。擁有更簡單的模式會以犧牲複雜性爲代價,從而節省您可以節省的小空間。

沒有像「多態模型」這樣的東西,但模型之間存在多態關係。這些對於數據庫來說更難理解,它們需要一個複合關鍵字,並且不能使用外鍵約束進行驗證,但在特定情況下它們可能會有用。

然而,你所描述的這種情況不是其中之一。

多態關係最好留在實體關係的「邊緣」,因爲檢索它們的開銷可能更高。理想情況下,他們不應該參與:through關係,或者可能涉及JOIN,因爲查詢的複雜性會迅速升級。

就您的數據庫而言,STI表是常規記錄。 type列僅僅是關於如何實例化ORM的提示。總體而言,只要實體具有相當數量的通用性,它們就非常有效。

相關問題