2010-05-17 31 views
0

我不知道如何在我的应用程序中设计几个类。 基本上这是一个情况:问题与类设计模拟不同类的用户首选项

  • 每个用户可以有许多偏好
  • 每个偏好可以被称为不同的类的一个目的
  • 偏好被表示为(例如专辑,电影,书籍等)一组值(例如分数等)。

的问题是,许多用户可能对同一对象的首选项,例如:

John: score=5 for filmid=apocalypsenow 
Paul: score=3 for filmid=apocalypsenow 

,自然我不想复制的对象电影中的每个用户。

所以我可以创建一个名为“偏爱”拿着得分,然后一个目标对象,像类:

User{ 
    hasMany preferences 
} 

Preference{ 
    belongsTo User 
    double score 

    Film target 
    Album target 
    //etc 
} 

,然后定义只是一个目标。 然后我会创建目标类(专辑,电影等)的接口:

Interface canBePreferred{ 
    hasMany preferences 
} 

而实现所有这些类的。 这可以工作,但它看起来很丑,需要大量的连接才能工作。 你有一些模式可以用来模拟这个很好吗?

干杯, Mulone

回答

0

的喜好与用户和对象既有关系。可能有一个或多个用户表示的偏好。可能会有一个或多个关于对象的偏好。

用数据建模术语来说,用户与首选项有0到N的关系,而对象与首选项有0到N的关系。

首选项应该是与用户和对象分开的类。

+0

谢谢! 有没有一种优雅的方式来建模与不同类别的关系? 现在我会用不同的成员做到这一点: 电影targetFilm 专辑targetAlbum 等等 但是,这是非常丑陋的,需要的逻辑。 有什么想法? – Mulone 2010-05-17 14:02:36

+0

另外,是否可以在Grails中使用接口? 我找不到关于它的文档。 – Mulone 2010-05-17 14:10:00

+0

对不起。我是一名数据建模师,而不是Grails开发人员。就你的对象而言,你可以有一个庞大的类,它拥有你想要建模的所有不同对象的所有元素。空间有点浪费,但在概念上更简单。 或者,您可以拥有一个基础对象类,定义常用元素,并让您的电影和专辑类继承基础对象,并分别定义特定于电影和专辑的元素。 – 2010-05-17 14:26:41

0

我更喜欢创建接口的概念,例如IPreferrable,我相信这些接口在Grails中通过Groovy基础支持。我同意首选项应该与用户对象分离,但是如果其他对象有效地代表了您的偏好分类标准,那么您可以在构建首选项对象图时重用它们。从领域建模的角度来看,你提出的建议没有问题,但用户对象可能会变得相当沉重。

从持久性的角度来看......因为这些只是首选项,您可能能够将整个首选项对象图序列化为XML。根据您的数据库引擎,您可以使用SQLXML,这意味着您仍然使用XQuery/XPath来处理原生的XML DOM类型和原生查询。这不应该做,以避免正确的数据库设计,但在某些情况下是合理的。考虑到这一点,从性能的角度来看,(de)序列化总是更加昂贵,尽管向JSON对象,Meta标签结构和其他格式转换变得更容易。当然还有其他的方法可以解决这个问题,但是由于你想要替代方案,这只是另外一种选择。