Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 复制Rails关联是否是糟糕的数据设计?_Sql_Ruby On Rails_Ruby On Rails 3 - Fatal编程技术网

Sql 复制Rails关联是否是糟糕的数据设计?

Sql 复制Rails关联是否是糟糕的数据设计?,sql,ruby-on-rails,ruby-on-rails-3,Sql,Ruby On Rails,Ruby On Rails 3,假设我有一个具有以下模型关联的Rails 3应用程序: user belongs_to :group item belongs_to :group belongs_to :user 如果代码编写不仔细,可能会导致数据差异,其中: 项目组 及 item.user.group 不再返回相同的组(当它们应该返回时)。一个项目应始终只属于一个组 我的理解是,创建这种重复关联可能是为了简化查询(减少连接的表的数量) 因此,我的问题是,这只是一个彻头彻尾的糟糕做法,还是一个有效权衡的问题,在

假设我有一个具有以下模型关联的Rails 3应用程序:

user
  belongs_to :group

item
  belongs_to :group
  belongs_to :user
如果代码编写不仔细,可能会导致数据差异,其中:

项目组

item.user.group

不再返回相同的组(当它们应该返回时)。一个项目应始终只属于一个组

我的理解是,创建这种重复关联可能是为了简化查询(减少连接的表的数量)

因此,我的问题是,这只是一个彻头彻尾的糟糕做法,还是一个有效权衡的问题,在某些情况下,数据和关联重复是可以接受的,因为我们可以用更少的联接简化查询

更新

到目前为止,答案似乎是“权衡”,而不是“糟糕的做法/代码气味”

似乎有多种方法可以处理这一问题,可能有各种约束、优点、缺点、用例等:

1) 如上所述的非规范化重复数据 2) 项有一个:组,:到=>:用户 3) 项目委托:组:收件人=>:用户


我试图理解方法2和方法3之间的区别。在控制台中试用了这两种方法之后,调用item.group时Rails生成的查询似乎会有所不同。(2) 生成连接组和用户的单个查询。(2) 生成两个查询,首先查找用户,然后根据用户查找组。

我认为这是一个有效权衡的问题。严格地说,在完全规范化的数据库中,items表不会有group列,相反,它总是通过users表查找组。这具有最少的重复量,因此具有最高的数据完整性,但每次要查找项目的组时都要进行额外的连接。我假设一个用户也只属于一个组。如果一个用户可以属于多个组,那么我认为您必须拥有items.group\u id列才能知道一个项目属于哪些组


如果您希望在查找时获得更快的查询性能,可以保持现有的额外关联,并添加额外的before_*hook以确保item.group_id=item.user.group_id,如果它们不匹配,则会引发验证错误。这会使验证/插入速度稍慢,但会最大限度地提高数据完整性,并且在从数据库读取数据时仍能获得稍好的性能。

谢谢,这正是我要找的评论。是的,在本例中,用户只能属于一个组。请注意,
有多个:通过
模式通常适用于这种情况(如果您选择不去规范化数据)-如果用户
属于
组,而项目
属于
用户,您也可以说项目
有一个:组,:至=>:用户
。然后,您可以对某个项目调用
.group
,并获取其关联用户的组。@Thewalrus先生:谢谢,这对我提出了一些进一步的问题,编辑了原始问题。@BillyChan为什么一个问题不能有无效代码,甚至根本没有代码?概念可以在没有代码的情况下讨论。可以问一些关于概念的问题。本,如果我的话听起来不礼貌,对不起。但是你的问题看起来不那么严重。若一个项目属于用户,至少用户应该有许多项目?你为什么不能把这个问题写下来?还是说缺少另一面也是边缘案例的一部分?为什么你不能显示完整的组关联?Edge case没有错,但最好保持所有其他部分清晰和静态。Billy,我选择添加最少的伪代码,这是理解问题所必需的。我这样做是因为它减少了其他stackoverflow用户的阅读量。我认为其他协会与此无关。如果用户有许多项或有一项与问题无关。问题直接涉及到是否有重复数据,因此,如果一个人获得了查询性能和更简单的查询,那么失去数据完整性的可能性是一个合理的权衡。有一个和有多个确实重要,但你没有注意到。无论如何,我必须承认,我很难理解你的问题以及设计。如果你能向我解释为什么一个或多个问题对这个问题很重要,请解释……你是对的,我不理解为什么它很重要。