我有一个拥有成千上万条快照记录的应用程序。这些“快照”中的极少数(例如1000个中的1个)将通过:has_many关联具有一个或多个“位置”。
如何有效地发现快照是否有位置而不为每个快照触发活动记录查询?我目前的解决方案是为快照添加一个布尔字段 - 如果快照有一个位置,'has_position'设置为true。这似乎有点混乱,因为这意味着每次创建一个位置时我都必须修改相关的快照。是否有更简洁的方法来处理这种情况?
create_table "snapshots", :force => true do |t|
t.datetime "created_at",
t.datetime "updated_at",
t.boolean "has_position",
end
create_table "positions", :force => true do |t|
t.integer "snapshot_id"
t.datetime "created_at",
t.datetime "updated_at",
end
答案 0 :(得分:0)
如果您使用positions
的引用生成snapshots
的迁移,将使用
add_index :positions, :snapshot_id
附加到它的末尾。
如果snapshot_id
上的索引,数据库将采用log(n)查询来确定某个职位是否至少有一个关联记录。不如使用布尔值的常量时间,但只有成千上万的记录,它不应该明显更长(除非你非常频繁地这样做)。
此外,简单的has_position
布尔值可能比您想要在没有索引的情况下维护更难。您可以在创建关联位置时将其设置为true
,但在删除时无法将其设置为false
,因为可能存在另一个,并且您必须执行表扫描试。
如果由于某些原因使用索引是不合需要的(或者您确实需要不断的时间查找),那么我建议使用:counter_cache
列。