

観光地リストのデータを作成しているのですが、定休日の設定で困っています。

具体的には

**close_mon** ~ **close_sun**

のカラムを用意して0, 1で判断しているのですが、場所によっては  
「第二火曜日と第三月曜日は休み」や「振替休日休館」等ランダムな場合が多くあります。

こういったケースの場合はどのようにテーブルカラムを用意して設計をするのが好ましいのでしょうか？


CC BY-SA 3.0
2015-04-10T08:34:28.493
9002
2015-06-09T14:22:44.527
8500
question
mysql データベース設計 データ構造
ランダムな定休日を登録させる設計


個人的なやり方になりますが、大雑把でいいなら定休日は  
大体同じパターンに収束するのでパターン部分を別テーブルにします。

> テーブル1  
>  close_id 定休日パターンに紐付けるIDカラム
>
> テーブル2  
>  close_id  
>  close_pattern 定休日のパターン(計算式)

予想される休日のパターン数がある程度の数に収束するならこれで、  
極端に多くなる(数千パターンとか)になるなら更に分解して作りこみますね。  
例えば「第二火曜日と第三月曜日は休み」は  
「第二火曜日」と「第三月曜日」の定休日を合わせたものです。

他に完全ランダムな場合のやり方としてはカレンダーテーブルを用意して  
全日ON/OFF設定してしまうとかですね。

[code]

    shop_holiday   -テーブル例
     id,year,switch -カラム
     a01,2015,11100011100000～365桁の1と0で休日を表現 -データ
    
[/code]


CC BY-SA 3.0
2015-04-10T09:32:08.807
9006
2015-04-10T09:32:08.807
2020-06-17T08:14:45.997
-1
9262
9002
answer


似たような事を実現したことがありますが、  
・第二水曜は休み  
・最終木曜は休み  
・奇数月第二・第四金曜は休み  
・月曜は休み、ただし祝日は営業し翌日火曜が休み  
などのパターンがあり、やはり定義に苦しみました。  
わたしの場合は件数が少なかったのでカラムだけで表現するのは諦めました。  
レコードに登録するのは、上記の条件種別と、それに追加されるパラメータを用意しました。

month カンマ区切り対象月  
week カンマ区切り対象週6なら最終週を表す  
day 曜日番号(0～6)を指定  
opt 祝日営業かどうか  
そのほか、特殊な条件判断は、optの定義を増やし  
全件取得または表示対象を取得して、コード側で1件ずつ「今日は休みか？」を判定して  
表示していました。  
今日営業中のみ取得するなら、関数でなんとかすればいけるかもしれません。


CC BY-SA 3.0
2015-04-10T09:43:49.063
9007
2015-04-10T09:43:49.063
2605
9002
answer