Rails + validates_overlap gem:何时向数据库添加索引?

时间:2014-04-11 10:18:24

标签: ruby-on-rails postgresql validation indexing

我在Rails应用程序中使用validates_overlap gem(https://github.com/robinbortlik/validates_overlap)。这是模型代码:

  validates :start_time, :end_time, overlap: { scope: "device_id", exclude_edges: ["start_time", "end_time"] }

这是它触发的SQL:

SELECT  1 AS one FROM "bookings"  WHERE 
((bookings.end_time IS NULL OR bookings.end_time > '2014-04-11 13:00:00.000000') AND
(bookings.start_time IS NULL OR bookings.start_time < '2014-04-11 16:00:00.000000') AND
bookings.device_id  = 20) LIMIT 1

我只是想知道我是否应该在postgres数据库中添加一个涵盖start_time,end_time和device_id或类似内容的索引?例如像这样的东西:

add_index :bookings, [:device_id, :start_time, :end_time], unique: true

1 个答案:

答案 0 :(得分:1)

添加上述索引以确保数据库一致性是没有意义的。毕竟你要验证范围并排除实际边缘(唯一索引会检查边缘!)。

添加非唯一索引以加快验证是一个好主意。如果是这样,您应该分析您的数据和应用查询。 最简单的方法是简单地为每列添加一个索引。 Postgres仍然可以将这些用于多列查询(请参阅heroku devcenter)。 只有当它真正重要时(或者您不在其他组合中查询列),才需要多列索引。如果是这样,则device_id应该是索引Rule of thumb: index for equality first—then for ranges中的第一个。