【发布时间】:2019-11-30 10:30:57
【问题描述】:
我试图规范化我的数据库模型。但在这种情况下,我不知道该怎么做。给出以下模型:
- 客户有许多系统 (has_many :systems)
- 集群有很多系统 (has_and_belongs_to_many :systems)
我想显示客户的所有系统。那将是:@customer.systemobjects.each。这已经奏效了。
然后我可以将系统添加到集群(我提到的是“HABTM”关联)。在我的客户视图中,我只想显示与集群无关的系统(也与 Cluster.includes(:systems).where(systems: { id: sysid }).present? 一起使用)。
现在我的问题是:我也想显示特定客户的所有集群(以及该集群的系统)。但是,现在,我只能通过系统与客户建立联系。对我来说,在集群对象中添加对客户的引用会更容易(即使我已经在系统中拥有此信息)。
我应该添加这个参考吗?无论如何它与标准化有关吗?对于一般的数据库和具体的 Ruby On Rails,您如何从最佳实践的角度评估这种情况?当我只通过系统拥有它时(我怎么能在rails中做到这一点?),最好的方法是如何通过客户的每个集群?
【问题讨论】:
-
我担心集群和系统之间的 HABTM 关联。正如我所想的那样,您希望系统属于集群,但反之亦然。如果您的目的是让客户找到他们的系统所属的集群,那么您必须使用某种
through关联,而不是实际上具有相当狭窄的应用程序的直接HABTM。 -
说实话,我不明白你的顾虑。对我来说,一个集群由两个或多个系统(称为节点)组成。但是,在某些时候,可能会有一个 - 我们称之为 - 节点 3,它还不是集群的一部分(但可能在未来)。在我工作的大多数情况下(防火墙),创建集群并将节点添加到其中更为常见。这就是我在这里想要完成的。我错过了什么吗?
-
在我下面的解决方案中,系统不与集群关联是可以的:在这种情况下,
cluster_id为零,这是您可以毫无问题地允许的。我的担忧是语义上的(考虑到你并不总是有镜像关系,我什至认为更重要)。从概念上讲,我看不到集群在语义上是如何属于一个系统的,因此 HABTM 不适用。因此,这是一种单向关系。如果您以后愿意,我的解决方案仍然允许您指定一个集群并向其中添加系统/节点。
标签: ruby-on-rails database model associations