0

我有一个包含数万条快照记录的应用程序。这些“快照”中的极少数(例如 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
4

1 回答 1

0

如果您positions使用对 的引用生成迁移会发生什么snapshots,迁移文件将使用

add_index :positions, :snapshot_id

附加到它的末尾。

使用数据库上的索引snapshot_id将进行 log(n) 查询来确定一个位置是否至少有一个关联记录。不如使用布尔值的恒定时间好,但只有数万条记录,它不应该花费明显更长的时间(除非你非常非常频繁地这样做)。

此外,在没有索引的情况下,一个简单的has_position布尔值可能比您想象的更难维护。您可以将其设置为true创建关联位置,但不能将其设置false为删除,因为可能存在另一个位置,并且您必须再次进行表扫描。

如果由于某种原因不希望使用索引(或者您确实需要恒定时间查找),那么我建议使用:counter_cache列。

于 2013-01-27T15:15:06.060 回答