0

对于我的项目,我使用的是 Grails,但这是一个一般性的 ORM 问题。

我是 ORM 和 ER 图的新手,并试图弄清楚如何最好地描述/实现以下内容:

我有 2 个实体:用户、连接

一个连接由 2 个用户(和其他原始属性)组成。一个用户可以在多个 Connection 中找到。您如何描述 User 和 Connection 之间的关系?我不知道你会怎么称呼它,2对很多?您将如何在 ER 图中绘制它。

在GORM中,应该是双向关系吗?

编辑

作为附加要求,假设用户在关系中具有特定角色。像学生和老师。因此 Connection 将具有 User 类型的学生和教师属性。

4

2 回答 2

1

问题不在于 GORM,您的问题与实体有关。在对域类进行编码之前,您必须清楚地描绘出您想要保留和操作的信息。根据您的问题和评论,您更喜欢使用任何 RDBS。因此,让我们尝试对简单的表格进行成像(不要关心任何 ORM、Grails、双向\单向)并尝试填充这些表格的模拟细节。

用户

  • 昵称(字符串)
  • 其他用户字段

联系

  • 老师(用户)
  • 学生(用户)
  • 其他连接字段

好吧,现在我们知道所有用户和所有连接。对于给定的连接,我们可以说谁是老师 - connection.teacher 和学生 - connection.student。

注意:任何连接都只有两个用户。

关注用户。任何用户都可以是学生和教师。如果用户只能是学生或教师,则必须添加其他字段,例如

用户

  • 昵称(字符串)
  • isTeacher (布尔值)
  • 其他用户字段

现在我们有一个用户列表并且知道谁是 st。或技术。如何获得给定用户的所有连接?GORM 提供:Connection.findAllByStudent(givenUser)、Connection.findAllByTeacher(givenUser)

此表是否完全显示您的信息?

于 2013-08-08T05:34:05.867 回答
0

我认为您想要的可以描述为多对多关系users,并在 Connection集合上应用了某种约束。至于单向/双向,我相信您可以根据您的用例来完成任何一项任务——尽管单向可能更难映射/配置。

我还没有测试过这个,但是双向多对多应该是这样的

class Connection {
  ...
  Set users = [] //ensure users exists, constraints won't work on null 
  static belongsTo = [User] 
  static hasMany = [users: User]

  static constraints = {
    users maxSize: 2
  }
}

class User {
  ...
  static hasMany = [connections: Connection]
}

我没有想到一个单向的例子,但我相信你可能需要使用一个额外的映射类。

同样,我没有对此进行测试,但这里有一个带有映射类的单向多对多示例

class Connection {
  ...
  Set users = []
  static hasMany = [users: ConnectionUser]
  static constraints = {
    users maxSize: 2
  }
}

class User {
  ...
}

class ConnectionUser {
  User user
  Connection connection
  //or for cascading effects
  //static belongsTo = [connection: Connection]
  ...
  ... //lots of additional code to manage adding,
  ... //removing, updating Connection-to-User relationships
} 

Connection 知道用户,但用户不知道他们所属的 Connection。如果您使用映射类路由,则需要手动管理连接到用户的关系。看一下Spring Security Core PersonAuthority类的映射类示例。

于 2013-08-07T17:51:22.043 回答