Grails - 多个多对多通过自定义连接表w / Cascade Delete&相同的类没有属于

时间:2017-04-23 10:19:28

标签: database grails many-to-many gorm

我正在建立一个CRM系统,并希望规范化我的数据库。许多域类/数据库表使用以下字段,例如Employee,Contact,Lead等:

  • 地址
  • ******中国
  • EmailAddress的
  • SocialNetwork
  • ReviewSite

Employee Domain Class / DB Table以1对1的关系属于我的User域类。除了员工可以拥有许多电话号码,电子邮件地址等这一事实外,他们还可以拥有多对多关系以及与团队域类的一对多关系,以便员工可以团队领导'&许多不同团队的“团队成员”,而团队有许多不同的成员,只有一个领导者。

我的问题是在Grails中处理这些无数关系的最佳方法是什么。我的每个问题都有答案,但是当并行使用时,它们几乎总会遇到问题。

根据Burt Beckwith的说法,最好的解决方案是为每个关系手动创建连接表,并在不使用hasMany的情况下管理它们。但是,此解决方案无法在任何地方展示。还缺乏解释这些问题的高质量文档(这可以说是Grails最难掌握的部分)。

有人可以为这个更复杂的问题提供解决方案,解释所引用的较小的分段解决方案如何组合在一起吗?

以下是一个示例域模型演示我想要完成的任务:

class Employee {
    String firstName
    String lastName
    ...
    static belongsTo = [user: User]
    //Custom Pivot Tables or HasMany?
    static hasMany = [teams: Employee_Team, emails: Email, socialNetworks: SocialNetwork, ...]
}


class Team {
    String name
    ...
    static hasMany = [employees: Employee_Team]
}

class Employee_Team {

    static belongsTo = [employee: Employee, team: Team]

    static Employee_Team create(Employee employee, Team team, boolean flush = false) {
    new Employee_Team(employee: employee, team: team).save(flush: flush, insert: true)
    }
}

class EmailAddress {
    def email
    ...
    static hasOne = [owner: ????, leadContact: Lead, ...]
    ???? could be a Customer, Employee, Company, etc.
}

class SocialNetwork {
    String name
    ...
    static hasMany = [employees: Employee, customers: Customer, leads: Lead, ...]
}

https://chrisbroadfoot.id.au/2008/07/19/many-to-many-relationship-mapping-with-gorm-grails/

Multiple many-to-many associations in one Grails domain class

编辑:

回复vahid对我的用例的可理解的误解。首先,细节并不重要。我只是觉得使用foo,bar等会阻碍清晰度。其次,我已经将电话号码和电子邮件地址标准化到他们自己的表中,因为我不想限制人们使用有限数量的电话号码(AKA主要,辅助或工作,个人)并且我有许多表需要电话号码,电子邮件地址等字段。例如,员工(平台用户),联系人(其他公司的人员),公司(办公室主线),潜在客户,机会和客户都需要联系信息;主管可能与目标公司(具有多个办公室,部门和/或主线)的3个联系人(具有多个个人号码)相关联,并且需要为员工(SDR,客户经理和解决方案架构师)存储多个号码关于领导的演示。适合所有用例的硬编码字段是不可能的。最后,我正在建立一个神经网络,模拟数据点和社交网络之间的关系,以执行分类和预测建模。因此,我需要能够将一个数字追溯到它的所有者,并解析出与该数字相关的所有附属关系(可能跨越多个SASS实例)。关键是,有正当理由需要支持多个双向GORM映射w /涉及单个表的级联删除。但是,我还没有看到在Grails中执行的一个高质量的例子。例如,在Laravel中它很简单,因为多对多关系不需要“所有者”(belongsTo映射)。注意:我将EmailAddress域类更新为HasOne,但此域类还需要上面未显示的其他多对多映射。此外,我认为此更改阻止我将电话会议拨号号码映射到多个员工。

0 个答案:

没有答案