【问题标题】:Rails + validates_overlap gem: When to add indexes to the database?Rails + validates_overlap gem:何时向数据库添加索引?
【发布时间】:2014-04-11 10:18:23
【问题描述】:

我在 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

【问题讨论】:

    标签: ruby-on-rails postgresql validation indexing


    【解决方案1】:

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

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

    【讨论】:

    • 我想我同意你的回答(我绝对不是这方面的权威),但出于好奇,我进行了测试,并且 unique = true,我能够在没有的情况下保存相邻的预订数据库错误。重叠错误完好无损,仍由 ActiveRecord 处理。
    • 我有点不清楚。索引将检查所有三列是否相等并在这些列上强制执行唯一性。因此,只有当您尝试为具有相同开始和结束时间的相同 device_id 添加预订时,数据库才会拒绝此操作。
    猜你喜欢
    • 1970-01-01
    • 2017-02-10
    • 1970-01-01
    • 2011-12-24
    • 2018-02-27
    • 2018-08-24
    • 2012-10-13
    • 2021-12-16
    • 1970-01-01
    相关资源
    最近更新 更多