在我的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个表格 在谈论即将快速发展的大桌时,我不确定这是否是优化的解决方案 我很感激一些建议。
答案 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验证来检查同一商店不能重复工作日(同一天商店不应该有两个不同的开放时间间隔)