3

我正在規劃我的Rails項目的數據庫圖。
我有以下實體:Answer(繼承自Post),Question(也繼承Post)和Comment。
評論屬於答案或問題。
我將如何繼續這樣做?繼承Rails數據庫

我曾想過創建Posts表格,同時有問題和答案表,其中有每個問題和每個答案的條目。然後我會有一個連接評論和帖子的表格。
我覺得這個解決方案不乾淨,不夠通用。

什麼是最好和最有效的方法來做到這一點?

編輯
我沒有興趣在STI(單表繼承)解決方案。我們正在尋找一個有效的解決方案,因爲這將會(希望)成爲一個包含很多帖子的大型項目。

+0

STI是有效的。 –

+0

@Hizki你最終做了什麼? –

回答

3

默認的Rails繼承模型是Single Table Inheritance,它是最簡單,最乾淨,最通用,也是最不依賴數據庫的事情。

它只是通過從Post中繼承Answer和Question而實現。然後,您創建一個帖子表,其中包含所有您想要的帖子,答案和問題中的字段。

單表繼承不是最節省空間的技術,因爲posts表中的所有行都將具有Post,Answer和Question字段中的全部。但這是常規的,如果你在進入太空時遇到問題,你將能夠很好地遷移到更具擴展性的數據模型(如多表繼承)。單表繼承是有效率的,因爲它只需要一個查詢來通過ID查找帖子,而在其他數據模型中,可能會有額外的查詢來查找帖子所在的表(帖子,問題,答案)。

至於連接評論和帖子,您可以在評論模型中使用指向帖子的belongs_to關係,以及指向評論的帖子模型中的has_many關係。 (您需要在註釋表中添加一個post_id整數字段才能使其工作)。

cf. http://guides.rubyonrails.org/association_basics.html

您還需要在post_id上添加註釋索引以快速查詢帖子的所有評論:http://guides.rubyonrails.org/migrations.html

+0

我不認爲這是一個很好的做法,先從一個不可擴展的解決方案開始,後面可能會被替換...然後,我會被同樣的問題困住......所以... – hizki

+1

Single Table Inheritance is not 「不可擴展」,它只是可以向數據庫添加列。我建議Single Table Inheritance的原因是它是在Rails中進行繼承的傳統方式。 –

+0

你寫道,我可能想要「遷移到更具擴展性的數據模型」。爲什麼不從一開始就找到這個解決方案? – hizki

2

您應該使用STI使用多態關聯。

例如,在你的情況下,你應該懷疑你是否真的想擁有一個超類Post。也許問題和答案不應該屬於同一個層次結構,也許應該通過polymorphic association連接到課堂評論。那就是:也許他們應該被標記爲'可評論的'

+0

請參閱我對@gkop的解決方案的評論...這與你的相同。 .. – hizki

+0

對不起。這是一個錯誤。我修好了它。我實際上是想告訴你conssider多態關聯。這些可以很容易地索引(編號和類型組成的關鍵),你可以在單獨的表中擁有一切。這不是可伸縮或不可伸縮的問題。它更多的可能是希望數據庫比STI允許的更規範。 –