Rails has_and_belongs_to_many 关系中_ids 数组太大如何处理

suupic · 2012年03月13日 · 最后由 Rei 回复于 2012年03月13日 · 4326 次阅读

has_and_belongs_to_many 通过在每个模型中相应 xxx_ids[] 来建立关系 在一个关联非常多的场景,比如几万或几十万个关联,xxx_ids 会非常庞大 如何处理这样的情况?

两种方式,一个是在数据库设计上,如果可以减少子表,就尽量减少,让表关系更简单化;如果这个做不到,还可以用另外一种方式,在 model 中不要写这些关系,自己用程序代码去处理。rails 这方便是简化了编码,但是是以消耗硬件资源为代价的。

tag 的场境?如何你是 has many to many 的话肯定会很大吧,追求效率可以尝尝直接裸 sql,或者将对应关系 id 往 redis 数据库里塞。

#2 楼 @zhenning 楼主明显用的 mongodb

在 mongodb 中,如果你设置了 index, 还是很快的。不用担心

假设楼主用 mongodb:

把关联 ID 存在关联少的那端,不使用 has_and_belongs_to_many。双向关联都很巨大的情况很少见(或者楼主给个例子?)。

#5 楼 @Rei 确实是 mongodb 我在做一个涉及微博收藏的东西 一个用户可能收藏很多条微博,一条微博可能被很多人收藏

#6 楼 @suupic

把 ids 存在 User 端,查询收藏用户快 把 ids 存在 Tweet 端,查询用户收藏的 Tweet 快 两边都放,两个查询都快,不要用 mongoid 的 has_and_belongs_to_many 查询,它用了 in 查询,自己写一个能利用索引的查询。

其实量大的是 Tweet 量,收藏量我觉得不会大,新浪围脖的名人转发量也就千到万级吧。

mongodb 单文档上限 16m,一个 id 24byte

16 * 1024 * 1024 / 24 = 699,050.666667 =~ 70 万

如果收藏量真的达到这个级别,建议放在 User 端,查询的时候就不要查库了,直接拿用户的 favorite_tweet_ids 分页按 id 取 Tweet,每个 Tweet 都做个内存缓存。

以上说的没经过实践。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号