2011-05-26 79 views
0

这不是另一个我应该使用HABTM或HMT的问题。诚实。也就是说,我在am会问在下列情况下人们是否会使用HABTM或HMT。已经和属于很多,有很多通过

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

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

很明显,我可以在这里设置两个HABTM关系。

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

我的问题是,人们是否认为这是数据库结构的过度抽象,因为主要关系是在BOOKS和AUTHORS,BOOKS和TOPICS之间,而不是AUTHOR和TOPIC之间的直接关系?换句话说,虽然我可以去掉两个(额外的)连接表并使用更灵活的HMT关系,但我可能会淡化我的数据库的要点,即存储书籍,然后链接到AUTHORS和TOPICS。

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

此外,互联网上的所有其他例子,我可以找到使用HMT的“贯穿”表作为数据库的一个相对不重要的部分。例如 - 将其用作“通过”表来存储进行测试的学生成绩; - 存储订阅杂志的订阅者的杂志订阅信息。

我从来没有见过“through”表存储主要信息的例子。它似乎更适合于存储关于它加入的两个主表的辅助信息。

回答

0

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

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

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

相反,我需要HMT书籍作者和书籍的主题。 THEN如果我想存储有关作者和书之间的关系更多的信息,我有一个模型,将其存储在附加信息可能是:

  • 作者的年龄时,他写
  • 支付笔者量写
  • 笔者写完这本书

,并在每一种情况下,你可以看到存储在HMT模型中的信息是特定于这两个日期作者和b ook正在加入。 (所以,如果我有多个作者,关于作者#2 < - >书的信息将被存储在单独的HMT模型中。)

正如@ dasil003指出的,你可以围绕这一点尝试将多个关系存储在一个字段,但你可能无法正确加入。

0

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

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

+0

是的,我的意思是“有很多:通过=>”。另外,是的,这两个关联都有一个连接表,但我基本上想知道是否使用主表(在这种情况下是BOOKS表)试图充当AUTHORS和TOPICS的连接表是否聪明。这说明了吗?要回答你的问题,我认为书籍表将包含author_id和topics_id,所以每本书都可以用这种方式引用作者和主题。我只是想知道,如果我过度使用我的BOOKS表(使用它作为连接)过度使用HMT? – Jon 2011-05-26 02:15:15

+0

你绝对可以做到这一点。 HMT不检查表格的内容,只要你有正确的ID在那里,你可以坚持下去。所有的HMT(和':polymorphic')就是建立这些方法的,所以只要你注意你放在哪里,你就能摆脱它。即使在文档中,如果HMT仅仅是允许额外属性(通过作为离散模型)的HABTM,这可以颠倒过来,使得由“额外属性”组成的任何模型都可以是连接模型。只需添加ID! – Eric 2011-05-26 19:32:53

+0

@Eric,但是如果我把连接表放在BOOK表中,如果(例如)有两个作者写这本书,我不会遇到麻烦吗?给我的书我的书模型将有一个独特的条目#1。然后它需要链接到作者#1 _AS WELL AS_作者#2,第二个入口在哪里? Book表条目是不是只有一个author_id整数键和一个topic_id键? 在HABTM中,您只需重复键:即1-1,1-2,1-3(对于具有三位作者的书#1)。但在我的情况下,我的BOOKS表已经填充了条目,每个条目代表一本书。 ?? – Jon 2011-05-27 02:47:18

0

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

现在,在书上使用外国身份证不是一个好主意。你会试图使用两个表来创建一个多对多的关联,这是一个非常糟糕的关系数据库的事情:)而是,对于多对多的关联,坚持使用有很多通过,这应该是很好的。

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

+0

对不起,意思是“有很多:through =>”。我应该说我倾向于在书籍和作者之间进行常规HMT,以及在书籍和TOPICS之间进行未来升级,以防万一我需要添加关于这些关系的信息。但后来我很好奇我是否可以把这两个连接放在BOOKS表中,或者我是否变得太诙谐了一半...... – Jon 2011-05-26 02:13:45

+0

yeap,两个HTM是最好的方式去肯定:) – Spyros 2011-05-26 02:33:35