2016-08-23 11 views
1

私のRailsアプリケーションでは私はショップモデルを持っています。時間間隔の効率的な方法

私は平日に格納する必要があるなどの営業時間に対応:
月曜日午後06時00分 - 午前2時
火曜日19:00 - 午前1時
など。

私は多くを持っていることを期待店のレコードの私は迅速なアクセスについて多くを気にしていれば、それを格納するための最良の方法は何ですか?

1つの方法は、Postgresql hstoreタイプを使用することです。

私は店のテーブルにoppening_hours列に

"Monday" => "18:00-2:00", "Tuesday"=>... のようなハッシュを続けるだろうか私は、単純なリレーショナルアプローチ

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

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

しかし、私は必要な任意の時間でそれを解決することができます店舗に関する情報を表示するには、私は2つのテーブルを照会する必要があります。
急速に成長しようとしている大きなテーブルについて話したときに、これが最適化されたソリューションであるかどうかはわかりません。
私はいくつかのアドバイスをいただければ幸いです。

+0

私はハッシュを使用することをお勧めします。スケジュールと呼ばれる列を作成し、そこにハッシュを格納します。 – davidhu2000

+0

範囲の種類が気になる:https://www.postgresql.org/docs/current/static/rangetypes.html –

答えて

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", ...}}'); 
0

をしかし、ここでいくつかの違い

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つのスケジュールを保存するために1対多でなければならないと思います。

  • 私は平日は(お店が同じ日に2つの異なる開口部の間隔を持つべきではありません)同じお店のために繰り返すことができないことを確認するためにActiveRecordの検証を追加します

関連する問題