对于我的项目,我使用的是Grails,但这是一个普遍的ORM问题。
我是ORM和ER图表的新手,并试图弄清楚如何最好地描述/实现以下内容:
我有2个实体:用户,连接
连接由2个用户(和其他原始属性)组成。可以在多个Connection中找到用户。您如何描述用户和连接之间的关系?我不知道你会称之为什么,2对多人?你会如何在ER图中绘制它。
在GORM中,它应该是双向关系吗?
修改的
作为附加要求,假设用户在关系中具有特定角色。像学生和老师一样。因此,Connection将具有User类型的学生和教师属性。
答案 0 :(得分:1)
问题不是GORM,您的问题涉及实体。在对Domain类进行编码之前,您必须清楚地想象您要保留和操作的信息。根据您的问题和评论,您更喜欢使用任何RDBS。因此,让我们尝试对简单的简单表格进行映像(不关心任何ORM,Grails,bi \ uni-directions)并尝试填充此表格模拟详细信息。
用户强>
<强>连接强>
好吧,现在我们了解所有用户和所有连接。对于给定的连接,我们可以说谁是老师 - connection.teacher和student - connection.student。
注意:任何Connection只有两个用户。
注意用户。任何用户都可以是学生和教师。如果用户只能是学生或教师,则必须添加其他字段,例如
用户强>
现在我们有一个用户列表,知道谁是st。或科技。 如何获取给定用户的所有连接? GORM提供:Connection.findAllByStudent(givenUser),Connection.findAllByTeacher(givenUser)
此表格是否完整显示您的信息?
答案 1 :(得分:0)
我认为您想要的内容可以描述为many-to-many relationship,并在Connection users
集合上应用了某种约束。至于单向/双向,我相信您可以根据您的使用情况完成 - 尽管单向可能更难映射/配置。
我还没有对此进行测试,但双向多对多应该看起来像这样
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知道用户,但用户不知道他们所属的连接。如果您使用映射类路由,则需要手动管理“连接到用户”关系。请查看Spring Security Core PersonAuthority类以获取映射类的示例。