簡體   English   中英

在Grails中為產品目錄模型建模

[英]Modelling a product catalog model in Grails

我正在研究一個個人的Grails項目,並希望將一個領域模型放在一起代表一個產品目錄。 我真的無法決定最好的解決方法。 我將擁有許多不同的產品類別,盡管許多類別僅具有在所有類別中共享的基本屬性集(例如,產品名稱,產品描述,價格等)。 但是,某些產品將具有針對其類別的其他屬性。

我研究了實體屬性值(EAV)模型技術,該技術提供了非常可擴展的解決方案。 而且,我考慮了使用顯式OO繼承模型的途徑,其中我具有基本Product類的子類來表示具有附加屬性的任何產品。

顯然,第二種方法的擴展性較差-添加新產品類別將需要一個新實體,並且可能需要為前端創建一個自定義視圖/編輯器。 但是,作為開發人員,我認為編程模型更加清晰明了,並且可以根據邏輯進行編程。

EAV方法將允許動態擴展,但會導致更加神秘的編程模型,並且在DB(復雜表聯接)中會產生性能開銷。 可以動態生成前端的視圖/編輯器,以包括產品類別的任意數量的自定義屬性-盡管我敢肯定會出現這樣的情況,從可用性的角度來看,這種動態生成不足以滿足需求。

當我考慮像Grails這樣的框架時,沿着創建顯式繼承模型的路線似乎很有意義。 我不相信像Grails這樣的框架會很好地適合EAV方法-Grails的許多好處會因為復雜性而喪失。 但是,我不確定這種方法是否會隨着產品類別數量的增加而實際擴展。

我真的很想聽聽其他人對這種建模挑戰的經驗!

我遇到過類似的情況,並采用了繼承解決方案。 進入這個課程,我知道我從來不會超過10個班級,因此我並不擔心復雜性呈指數級增長。 盡管您將需要每個類的視圖和控制器,但是您可以做一些事情來減少代碼重復。 首先要做的是將所有常見的視圖代碼放入模板中。 例如,如果您所有的類都有價格,名稱和描述,則應將允許顯示和編輯此視圖的視圖代碼放入模板中。 不必在每個視圖中都有重復的代碼行,只需執行一個

<g:render template=”/baseView</g>render>

有關模板的更多信息,請參見http://www.grails.org/Tag+-+render 。我發現有用的第二件事是將所有共享控制器代碼移到一個類中,並定義可以從實際控制器調用的閉包。 這變得非常丑陋,因為我的save方法不僅可以確保正確處理基類的字段,而且還可以提供用於繼承類的特殊情況的代碼。 回顧此問題,一個更好的選擇可能是將自定義行為定義為需要它的域類的函數或使用服務。 這樣說來,將代碼放入可以從控制器調用的閉包中仍然很有幫助,因為它使我可以使用一行而不是30或40的長控制器主體。如果我不得不修改處理基類的代碼,則可以對其進行編輯定義了閉包的位置,並且該更改將反映在我的所有控制器上,而無需更改控制器的實際源文件的代碼。 這很有用,它使我可以在一個地方編輯代碼,而不必在10個控制器上編輯重復的代碼。

繼承與Hibernate和GORM配合良好。 請考慮使用 table-per-subclass映射,因為您無法使用(默認) table-per-hierarchy繼承映射定義NOT NULL約束。

您還可以將合成用於“不是這樣”的常見但共享的屬性。

EAV的“標准”是,您是否需要在不更改數據模型的情況下引入新屬性?

實際上,像您這樣的應用程序將繼承和EAV結合使用。

查詢JOIN ed表時,您會擔心性能。 如果您索引 SQL WHERE語句中包含的列,通常這不是問題。
(GORM / Hibernate將自動創建同樣很重要的外鍵。)(鑒於,必要的索引已經到位,並且DBMS提供了不錯的查詢優化器(即PostgreSQL oder SQL Server-也許不是MySQL),您可以在50毫秒或更短的時間內使用10個聯接從數百萬條記錄中進行選擇。)

最后,最近就您的問題進行了精彩的討論

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM