在我的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个表。
当谈到即将快速增长的大表时,我不确定这是否是最佳解决方案。
我希望你能给我一些建议。
您可以使用本机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", ...}}');
我会使用你的第二种方法,但有一些不同
class Schedule < ApplicationRecord
#weekday:integer, start_at:datetime, end_at:datetime
belongs_to :shop
end
class Shop < ApplicationRecord
has_many :schedule
#...
end
关于此解决方案的一些考虑:
首先,我认为在不同的列中存储开始和结束日期是合适的。原因是,你将能够执行查询,如"给我所有的商店,现在是开放的",你将不必解析列"opening_interval"中的每个值。
我会用一个数字来存储星期几。在查询数据库时,将列与数字进行比较要比将列与字符串进行比较容易,这似乎很直观。
我认为你们的关系应该是一对多的,以便为每个商店节省多达7个时间表。
我会添加一个ActiveRecord验证来检查工作日不能重复同一商店(商店不应该在同一天有两个不同的开放间隔)