高效的storig时间间隔方式

时间:2016-08-23 20:00:32

标签: ruby-on-rails postgresql datetime many-to-many

在我的Rails应用程序中,我有一个Shop模型。

我需要存放工作日和相应的开放时间,如:
周一18:00 - 2:00
周二19:00 - 1:00
等。

我希望有很多商店记录,我想知道存储它的最佳方式是什么,前提是我非常关心快速访问。

一种方法是使用 Postgresql hstore 类型。

我会保留像"Monday" => "18:00-2:00", "Tuesday"=>...这样的哈希值  在商店桌上的oppening_hours列中

或者我可以通过简单的关系方法解决它

class Schedule < ApplicationRecord  
  #weekday:string, start_at:datetime, end_at:datetime  
  belongs_to :shop  
end

class Shop < ApplicationRecord
  has_one :schedule
  #...
end

但是,当我需要显示有关商店的信息时,我必须查询2个表格 在谈论即将快速发展的大桌时,我不确定这是否是优化的解决方案 我很感激一些建议。

2 个答案:

答案 0 :(得分:1)

您可以使用原生ARRAY类型。它具有存储效率,可能会在ORM中得到很好的支持。

https://www.postgresql.org/docs/9.4/static/arrays.html

我会考虑这样的事情:

CREATE TABLE shop (
    ...
    schedule        text[][3]
);

INSERT INTO shop
VALUES (...
    '{{"Monday", "18:00", "2:00"}, {"Tuesday", ...}}');

答案 1 :(得分:0)

我会使用你的第二种方法,但有一些差异

class Schedule < ApplicationRecord  
  #weekday:integer, start_at:datetime, end_at:datetime  
  belongs_to :shop  
end

class Shop < ApplicationRecord
has_many :schedule
  #...
end

这里有一些关于这个解决方案的考虑因素:

  • 首先,我认为将开始日期和结束日期存储在不同的列中是合适的。原因是你可以执行像#34这样的查询;给我所有现在开放的商店&#34;您不必解析列中的每个值&#34; opening_interval&#34;。

  • 我会使用一个数字来存储星期几。看起来直观的是,在查询数据库时,将列与数字进行比较比将其与字符串进行比较更容易。

  • 我认为您的关系应该是一对多的,以便为每个商店保存最多7个时间表。

  • 我会添加一个ActiveRecord验证来检查同一商店不能重复工作日(同一天商店不应该有两个不同的开放时间间隔)