最佳实践:应该避免双向关系吗? [关闭]

Posted

技术标签:

【中文标题】最佳实践:应该避免双向关系吗? [关闭]【英文标题】:Best Practice: Should one avoid bi-directional relationships? [closed] 【发布时间】:2012-01-25 06:16:44 【问题描述】:

我想知道处理这样的数据模型的最佳做法是什么:

我们有 3 个实体:

角色 用户 权限

请注意,实体表示为 java 类,并将通过 hibernate 映射到数据库,无论如何我认为在不了解这些技术的情况下可以回答这个问题。

RoleUser 之间以及RolePermission 之间存在多对多关系。

在这里建立双向关系可以吗? 所以,你可以让Role 给你他所有的成员,并让User 给你他所有的角色。

您可以询问两个实体非常方便,但是一个缺点是,每当您删除关系时,您都必须管理两个实体。

例如如果您从User 中删除Role,您还必须从Role 中删除User。如果有很多这样的关系,这可能会很烦人。因此,我想知道最佳做法是什么。

【问题讨论】:

不明白为什么它被选为主题。数据建模不仅仅是关于 SQL 数据库,它是程序员所做的事情。 【参考方案1】:

我尽量避免双向关系。而是用 DAO/Repository 中的显式查询替换一个方向。使模型更简单,如果通过接口正确完成,应用程序将清除循环依赖

【讨论】:

单向关系更容易管理。如果显式查询/查找导致性能问题,您可能必须转到双向关系。【参考方案2】:

这里可以建立双向关系吗?所以,你可以让 Role 给你他所有的成员,并让 User 给你他的所有角色。

是的。如果您确实需要两种方式的导航,那么没有理由阻止自己以最简单的方式获得它。

一个缺点是,每当您删除一个关系时,您都必须管理这两个实体。

这取决于实现,可以以一种同步两个“端”的方式实现数据模型。

【讨论】:

以上是关于最佳实践:应该避免双向关系吗? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

加盐密码:最佳实践? [关闭]

(Java)包组织有最佳实践吗? [关闭]

创建数据模型的最佳实践 [关闭]

在 C# 中实现加密和解密的最佳实践 [关闭]

脚本标签内的 HTML 注释是最佳实践吗? [关闭]

最佳实践 - 根据状态操作,这样能避免吃掉异常