Postgres HStore与HABTM

时间:2014-02-06 15:53:07

标签: ruby-on-rails postgresql

我正在构建一个应用程序,其中包含可以使用其他模型的条目标记的模型,类似于Stackoverflow的标记功能。

例如:

class Question < ActiveRecord::Base
    has_and_belongs_to_many :tags
end

class Tag < ActiveRecord::Base
    has_and_belongs_to_many :questions
end

我正在讨论仅使用连接表设置has_and_belongs_to_many关系,或者使用Postgres的hstore功能将标记添加到哈希。

寻找任何具有类似经验的人,可以说出性能差异,障碍或其他任何可以说服我的方式。

编辑:

我想我还应该提一下,这将是一个使用AngularJS前端的API。

1 个答案:

答案 0 :(得分:1)

你正在描述一个大辩论的主题:)规范化与非规范化。使用多对多允许您进行很好的查询,例如&#34;有多少人使用某个标签&#34;以一种非常简单的方式。 HStore也非常好,但你到处都是数以千计的相同标签。我在不同的项目中使用这两种方法,但是当你决定有一天移动数据库时,真正的问题就来了。使用Hstore,您将被困在postgresql或必须重写您的代码。如果超高速是重要的以及查询不同的方式,你经常想要尽快加载一个用户记录,并显示所有使用的标签,我通常做两件事:创建多对多的关系,因为标签通常也是连接到更多的对象,例如用户从标签表中有许多标签,标签连接到让我们说与产品相关的品牌等等。

然后我在用户表上创建一个带有hstore或json对象的附加字段,该字段添加每个标记或在多对多关系被销毁时将其删除。

举个例子:在我的项目中,我有一些公司(近1000万)对某些关键字以及他们在谷歌上的排名感兴趣。此表包含数百万行,但仅连接到200万个与搜索结果相关联的关键字。通过这种方式,我可以快速查询搜索结果的人数和人数。

如果客户打开关键字搜索页面,我会使用json从文本列加载关键字,这比通过表格更快。