拥有和属于许多通过

时间:2011-05-26 01:55:46

标签: ruby-on-rails ruby-on-rails-3 database-design

如果我使用HABTM或HMT问题,这不是另一个问题。诚实。也就是说,我 am 会询问人们是否会在以下情况下使用HABTM或HMT。

  • 我有一个模型“书”。
  • 我想添加一个模型“作者”。作者has_many书籍。一本书has_many作者。
  • 我想添加一个模型“主题”。一个主题has_many书籍。一本书has_many主题。

我已经知道两个关联之间的区别,我知道连接表,我知道(通常)每个关联系统的好处。

显然,我可以在这里建立两个HABTM关系。

然而,让我感到震惊的是,我也可以通过将作者和主题声明为“has_many:authors / topics,:through =>:books”来将我的foreign_ids放在“Books”模型表中。

我的问题是,人们是否认为这是对数据库结构的过度抽象,因为主要关系是BOOKS和AUTHORS,BOOKS和TOPICS之间的关系,而不是AUTHOR和TOPIC之间的直接关系?

换句话说,似乎当我放弃两个(额外的)连接表并使用更灵活的HMT关系时,我可能会稀释我的数据库的点,即存储BOOKS,然后链接致AUTHORS和TOPICS。

我认为这是一个相对有趣的问题。

此外,互联网上我发现使用HMT的所有其他示例都使用“通过”表作为数据库中相对无关紧要的部分。例如 - 使用它作为“通过”表来存储参加测试的学生的成绩; - 存储订阅杂志的订阅者的杂志订阅信息。

我从未见过“直通”表存储主要信息的示例。它似乎更多的是存储它加入的两个主表的辅助信息。

3 个答案:

答案 0 :(得分:0)

我不知道你的意思是“belongs_to_many:通过书籍”,但是habtm和hmt都使用了连接表。如果你有多对多的关系,那么就无法摆脱它。我不明白你打算如何在书桌上存储多个作者或主题。如果您将值组合在一个字段中,则无法加入作者或主题。如果你有一个固定的最大值,你可以为每一个添加一个关联字段,但在大多数情况下这似乎很糟糕。

关于hmt关系的主要数据的示例。想象一下,你假设每个主题在一本书中有一个特定的章节(我知道,但它适合你的模型)。这个主题可能是每本书的不同章节。在这种情况下,您需要将章节字段添加到连接表并使用hmt。

答案 1 :(得分:0)

一般来说,绝大多数Rails人都喜欢通过。说实话,我认为HABTM将在未来的版本中从Rails中删除。使用through更明确,更不容易出错,我强烈建议您使用它。特别是,如果这是您第一次在Rails中创建连接表。

现在,在书上使用外国身份证不是一个好主意。您将尝试使用两个表进行多对多关联,这是一个非常糟糕的关系数据库要做的事情:)相反,对于多对多的关联,坚持使用有很多通过,这应该没问题。

(顺便说一句,belongs_to_many不存在,你需要第三个模型才能做到这一点)

答案 2 :(得分:0)

我不能做我想做的事;也就是说,将连接表放在BOOKS中。为什么不?因为如果我将BOOKS作为连接表,那么每本书将只有一个“author_id”和一个“topic_id”。由于我希望每本书能有多位作者,每本书有多个主题,所以我无处可放置这些关系。

这不起作用的原因是HMT允许您创建可以存储关于关系的其他信息的模型。在我的情况下,这将是特定作者与特定主题之间的关系。

一本书不是这种关系的实例。

相反,我需要为作者提供HMT书籍,为主题提供书籍。 THEN 如果我想存储关于作者和书籍之间关系的其他信息,我会有一个模型来存储它。其他信息可能是:

  • 作者写作时的年龄
  • 作者付款以写入
  • 作者写完这本书的日期

并且在每种情况下,您都可以看到存储在HMT模型中的信息对于作者和正在加入的书籍都是特定的。 (因此,如果我有多位作者,则有关作者#2< - > book的信息将存储在单独的HMT模型中。)

正如@ dasil003指出的那样,你可能会在这个问题上徘徊并试图在一个字段中存储多个关系,但是你可能无法正常加入。