思ったより複雑な "店舗の営業時間データ" を扱いやすく管理する工夫
こんにちは、ちょくにゃんです。
ナビタイムジャパンで、法人向け店舗データ管理・発信クラウドサービス『NAVITIME Location Cloud』の開発・運用を担当しています。
はじめに
ナビタイムジャパンが提供するアプリやWebサービスでは、お店、観光スポット、駅といった様々な地点の情報を扱っています。その中で店舗事業者向けに提供している『NAVITIME Location Cloud』というサービスでは、そういったアプリやGoogleなどの様々な検索メディアで表示される店舗の情報を、店舗事業者自身で一括で管理する機能を提供しています。
店舗の情報には店舗名、住所、対応する支払い方法、キャンペーン情報など様々なものがありますが、今回はその中で営業時間について紹介します。営業時間の情報は思ったよりも複雑で、それをツール上で扱うために様々な工夫を取り入れています。
この記事では、『NAVITIME Location Cloud』で店舗の営業時間の情報をどのように工夫して管理しているかについて紹介します。
営業時間は思ったより複雑な情報
営業時間とは、スーパーや飲食店などの店舗が何時から何時まで営業しているか・していないのかの情報のことです。例えば営業時間に「9時から21時まで」と記載があれば、9時から21時までその店舗を利用することができます。
と当たり前のことを書きましたが、営業時間にはもっと複雑なパターンが様々あります。土曜日・日曜日は営業しなかったり、午前の部と午後の部に分かれていたり、ショッピングモールの休業日に合わせて休業したり・・・。開いていると思ってお店に行ってみたら営業していなかったという経験は皆さんにもあるかもしれません。
営業時間データを構造化して管理するメリット
そんな様々なパターンがある営業時間のデータですが、管理システムで扱うことを考えるとテキスト表現よりも構造的なデータで管理するほうが色々と利点があります。「9時から21時まで」のような営業時間を、例えば次のようなJSON形式にして管理するイメージです。
{
"business_hour": {
"start": "09:00",
"end": "21:00"
}
}
このように営業時間データを構造化して管理しておきたい理由を説明します。
1. 営業時間の書き方の違いを吸収できる
営業時間はテキストで示されることが多いですが、書き方は人それぞれです。
月〜金 9-17時 土日祝休業
平日は9時から17時営業、土日祝日はお休み
月: 09:00-17:00 火: 09:00-17:00 水: 09:00-17:00 木: 09:00-17:00 金:09:00-17:00
これらは全て同じ営業時間を示していますが、すぐには同じだとは伝わりません。データを管理する人は1人とは限らないため、表現に一貫性を持たせられるようにしておかないと店舗の利用客を混乱させてしまう可能性があります。
テキスト表現とは別に構造化したデータで管理しておくことで、一貫性のある表現ができるようになります。
2. 営業中かどうかの判定ができるようになる
営業時間をテキストではなく日時データとして管理しておくことで、ある時点の日時との比較ができるようになります。これを使って店舗の営業時間と現在日時を比較すれば、現在その店舗が営業中かどうかの判定を機械的に行うことができるようになります。
テキストでも人が読めば営業中かどうか判断できますが、祝日などが絡むと判断が難しくなります。また、現在営業中の店舗のみを表示したり、祝日などを考慮した直近1週間の営業時間を表示するようなシステムは営業時間が構造化されていないと実現できません。
3. 店舗検索サイトや検索メディアへのデータ連携がしやすい
店舗事業者が一般のユーザーに正しく店舗の情報を伝え来店を促すには、店舗を探す際に使われるメディアへ正しく情報を掲載する必要があります。ここでも、営業時間を構造化して管理しておくことが重要になります。
例えば店舗検索サイトでは、テキスト情報に加えて構造化データとして店舗情報を含めることで、検索エンジンにより詳細に店舗の情報を伝え、店舗を探すユーザーにページを見つけてもらいやすくすることができます。営業時間の情報もページの構造化データに含めることができるので、SEOの観点で有利になります。
また、GoogleやYahoo!といった検索メディアに店舗情報をデータ連携して掲載する際も、構造化しておいたデータを元に各メディアに合わせた表記に変換することになります。テキスト表現からその都度変換するのは難易度が高いため、大本のデータは構造的に管理しておきたくなります。
よくある営業時間のパターンからデータ構造を考える
では、どんなデータ構造であれば複雑な営業時間を表現できるのか、よくある営業時間のパターンを見ながら考えていきます。複雑なパターンに対応していくとデータ構造はどんどん複雑になっていきます。
1. 曜日ごとに営業時間が変わる
毎日営業はしているものの、特定の曜日は営業時間が変更されている例です。例えば、月曜日から金曜日は10時から20時、土曜日と日曜日は10時から18時の営業といった形です。
このパターンに対応するには、営業時間データは曜日ごとに持っておく必要があります。
2. 特定の曜日は休み
例えば土日は営業しない店舗の場合、何時から何時という表現ではなく「定休日」や「休業」といった表現になります。
営業時間データには、何時から何時という開始・終了時刻のペアだけでなく、そもそも営業しているかどうかという情報を持たせる必要があります。
3. 1日の中で休業時間がある
銀行や医院などは、午前の部・午後の部のように休業を挟んで1日の営業時間が分かれていることがあります。
1日の営業時間の中で、開始・終了時刻のペアを複数持てるようにしておく必要があります。
4. 月内の特定のタイミングの変更
第2・第4月曜日は休み、のように、月内の特定のタイミングでその曜日の営業時間が変更される場合があります。
曜日ごとの通常の営業時間の中でも、その月の中で何回目かによって営業時間を分けて管理できるようにする必要があります。
5. 特定の日だけ営業時間が変わる
ここまでは曜日や月で何回目かといった日付に対して相対的な条件で決まる営業時間でしたが、何月何日はこの営業時間というような絶対的な指定が必要になる場面もあります。
年末年始やゴールデンウィークなどの大型連休は年によってタイミングや日数が変わるため、日付に対しても直接営業時間を設定しておけるようにします。このような直接指定された営業時間をよく「特別営業時間」と呼びます。
営業時間データの持ち方
ここまで挙げてきた営業時間の様々なパターンを表現できるデータ構造の一例を示します。
{
"月曜日": {
"通常時": [
{
"月内の何週目の情報か": 0(指定なし),
"営業しているかどうか": true,
"営業時間": [
{
"開始時刻": "08:00",
"終了時刻": "12:00"
},
{
"開始時刻": "13:00",
"終了時刻": "17:00"
}
]
},
{
"月内の何週目の情報か": 1,
"営業しているかどうか": false
}
],
"祝日時": {
"営業しているかどうか": false
}
},
"火曜日": { ... },
...,
"特別営業時間": [
{
"日付": "2024-01-01",
"営業時間": {
"営業しているかどうか": false
}
},
...
]
}
大きく曜日ごとにデータを持ち、それぞれ通常時とその日が祝日だった場合の営業時間を持たせています。それとは別に特別営業時間を指定できるようにしています。
実際には翌日が祝日の場合の営業時間変更やラストオーダーの有無、フロアによる営業時間の違いなどの考慮も必要になるため、さらに複雑なデータ構造になります。
営業時間を入力する際の工夫
このような複雑な営業時間を管理しやすくするための、入力時の工夫についても紹介します。
テキストから補完できるようにする
システム上は様々なパターンの営業時間に対応するために複雑になっていますが、実際の営業時間でそのパターンを網羅するようなものはそうそうありません。たいていは毎日同じ営業時間だったり土日が休みだったりするくらいです。
データ構造が複雑になるほどその入力画面も複雑になるため、『NAVITIME Location Cloud』ではテキストからの補完入力に対応しています。例えば以下のような自由形式のテキストを解釈できます。
テキストを解釈して構造化する方法については以下のnote記事を参照してください。
特定の日からの営業時間変更を管理できるようにする
その日・その曜日だけ営業時間が変更になる、ではなく、何月何日以降は営業時間全体がまるまる変わる、といったこともあると思います。
こういったパターンにも対応できるよう、先ほど載せたような営業時間の構造化データ全体を、特定の日時を境に切り替えられるような作りにしています。
最後に
ここまで、店舗の営業時間の複雑なパターンを見ながら、その情報を構造化して管理する理由と工夫について紹介しました。参考になれば幸いです。
店舗データ管理・発信クラウドサービス『NAVITIME Location Cloud』は、店舗事業者がこのような店舗に関する複雑なデータを簡単に管理・発信できるよう支援し、誰もが店舗についての正しい情報を得られる社会の実現に向けて貢献していきます。
最後までお読みいただきありがとうございました!