【问题标题】:Grails Data Modelling dilemmaGrails 数据建模困境
【发布时间】:2012-08-18 01:26:13
【问题描述】:

我希望有人可以帮助我确定为这个设计建模的最佳方法,听起来应该是一个简单的用例。

我有一个Client 域类。我有一个Person 命令对象和一个Firm 命令对象,它们代表公司或组织。

我也有子类,为了命名,我们将它们称为ClientSubClass1ClientSubClass2,它们都扩展了Client

我感到困惑的是,客户应该可以是个人还是公司。

所以我认为最好的前进方式是使用嵌入并将 Firm 类和 Person 类嵌入到 Client 类中,并添加一个标志来指示客户是个人还是公司。 否则我看不到如何使用继承来完成我所需要的。

任何想法都将不胜感激,谢谢。

【问题讨论】:

  • 为什么个人和公司不能只扩展一个基客户端类?
  • 会有其他类也可以扩展 Person 或 Firm 但不是客户端。

标签: sql database-design grails polymorphism data-modeling


【解决方案1】:

在 Grails 中,您可以在域类中使用继承,而 GORM 将在数据库中为您创建和管理一个标志,而无需您显式声明。我会创建从 Client 继承的 Person 和 Firm 域类。

命令类主要用于将请求中的参数绑定到控制器操作,这与数据的存储和检索方式有些无关。

【讨论】:

  • 我认为当您想重用常见结构(包括约束)时,也应该使用它们(CommandObjects),例如一个地址,但不希望在自己的表中有地址。
【解决方案2】:

为了回答这个问题并总结一下,我决定创建一个更高级别的 Contact 域类,它有一个 Person 和 Organization 子类(tableperHierarchy false)。

客户端扩展了个人并包含一个嵌入式组织,以及一个标志,用于指示在引用该客户端时我应该使用个人详细信息还是组织详细信息,例如当我想显示客户端名称时,我知道是使用个人姓名(头衔、名字、首字母、姓氏)还是来自嵌入式组织的公司名称。

在 Contact 类定义中,我还使用了一个嵌入的 Address 类,它保存在 'src/groovy' 中,因此它不会创建自己的表。

所以我混合了组合和继承,效果很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多