首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Grails中建模产品目录模型

在Grails中建模产品目录模型
EN

Stack Overflow用户
提问于 2010-12-06 05:04:27
回答 2查看 1.3K关注 0票数 0

我正在研究一个个人Grails项目,并希望组合一个域模型来表示产品目录。我真的无法决定做这件事的最好方法。我将有许多不同的产品类别,尽管许多类别将只有一个基本的属性集,这些属性在所有类别中共享(例如,产品名称,产品描述,价格等)。但是,某些产品将具有特定于其类别的附加属性。

我研究了实体属性值(EAV)模型技术,它提供了一个非常可扩展的解决方案。而且,我考虑了使用显式OO继承模型的路线,在该模型中,我有一个基类Product的子类来表示任何具有附加属性的产品。

显然,第二种方法的可扩展性较差-添加一个新的产品类别将需要一个新的实体,并且可能需要一个用于前端的自定义视图/编辑器。然而,作为一名开发人员,我认为编程模型在编写代码时要清晰得多,也更符合逻辑。

EAV方法允许动态扩展,但会导致更复杂的编程模型,并且会在DB (复杂的表连接)中产生性能开销。前端的视图/编辑器可以动态生成,以包含产品类别的任意数量的自定义属性-尽管我肯定会出现这样的动态生成从可用性的角度来看是不够的情况。

当我考虑Grails这样的框架时,沿着创建显式继承模型的路线走下去似乎是有意义的。我不相信像Grails这样的框架会如此适合EAV方法-- Grails的很多好处都会在复杂性中消失。然而,我不确定这种方法是否会随着产品类别数量的增加而实际扩展。

我真的很想听听其他人在这类建模挑战上的经验!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-12-06 07:01:45

我遇到过类似的情况,于是选择了继承解决方案。进入这一阶段,我知道我永远不会有超过10个类,所以我不担心复杂性的指数增长。尽管每个类都需要视图和控制器,但是您可以做一些事情来减少代码重复。首先要做的是将所有常见的视图代码放入模板中。例如,如果您的所有类都有价格、名称和描述,则应该将允许显示和编辑这些内容的视图代码放入模板中。不需要在每个视图中都有重复的代码行,您可以简单地执行

代码语言:javascript
复制
<g:render template=”/baseView</g>render>

有关模板的更多信息,请参阅http://www.grails.org/Tag+-+render我发现的第二件有用的事情是将所有共享控制器代码移到一个类中,并定义我可以从实际控制器调用的闭包。这变得相当丑陋,因为我的save方法不仅可以确保基类的字段被正确处理,而且还会有用于继承类的边角情况的代码。回顾这一点,更好的选择可能是将自定义行为定义为需要它或使用服务的域类的函数。尽管如此,将代码放入可以从控制器调用的闭包中仍然是有帮助的,因为它允许我拥有一行长的控制器主体,而不是30或40行。如果我必须修改处理基类的代码,我可以在定义闭包的地方编辑它,这种更改将反映在我的所有控制器中,而不需要对控制器的实际源文件进行代码更改。这非常有用,让我可以在一个地方编辑代码,而不是在10个控制器上编辑重复的代码。

票数 0
EN

Stack Overflow用户

发布于 2010-12-06 16:40:03

Inheritance在Hibernate和GORM上运行良好。考虑using table-per-subclass映射,因为您不能使用(默认) NOT NULL继承映射定义table-per-hierarchy约束。

您还可以将composition用于“不太常见”但共享的属性。

EAV的“标准”是,您是否需要在不更改数据模型的情况下引入新属性?

在实践中,像您这样的应用程序结合使用继承和EAV。

在查询JOINed表时,您关心的是性能。如果您对包含在SQL WHERE语句中的列执行index操作,这通常不是问题。

(GORM/Hibernate将自动创建外键,这也很重要。)(假设有了必要的索引,并且数据库管理系统提供了一个不错的查询优化器(即PostgreSQL优于SQL Server -可能不是MySQL),您可以在50毫秒或更短的时间内使用10个连接从数以百万计的记录中进行选择。)

最后,有一个很好的,最近的,关于你的问题的discussion

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4361172

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档