Stockage des heures d’ouverture dans une firebase database

J’essaie actuellement de trouver le meilleur moyen de stocker les heures de fonctionnement d’une entreprise dans une firebase database.

Par exemple:

Business A a les heures d’ouverture suivantes

  • Lundi: 9h à 17h
  • Mardi: de 9h à 17h
  • Mercredi: de 9h à 17h
  • Jeudi: 9h à 17h
  • Vendredi: de 9h à 17h
  • Samedi: 9h – 12h
  • Dimanche: fermé

Actuellement, j’ai un modèle de données similaire au suivant

CREATE TABLE "business_hours" ( "id" integer NOT NULL PRIMARY KEY, "day" varchar(16) NOT NULL, "open_time" time, "close_time" time ) 

où le “jour” est limité au choix des 7 jours de la semaine en code (via l’ORM). Pour tester si une entreprise est fermée un jour donné, elle vérifie si les options open_time et close_time sont NULL. Il est lié à l’entreprise via une table intermédiaire (Many To Many Relationship).

Quelqu’un at-il des suggestions pour ce schéma de firebase database? Quelque chose à ce sujet ne me semble pas juste.

Dans l’ensemble, je ne vois rien de mal à cela. Sauf…

  1. Je stockerais le jour de la semaine comme un entier en utilisant le système de numérotation que votre langage de programmation natif utilise (dans ses bibliothèques). Cela diminuera la taille de la firebase database et supprimera les comparaisons de chaînes de votre code.

  2. Je mettrais probablement la clé étrangère à la table de travail ici même dans ce tableau. De cette façon, vous n’aurez pas besoin d’une table de liens.

Donc je suppose que je ferais:

 CREATE TABLE "business_hours" ( "id" integer NOT NULL PRIMARY KEY, "business_id" integer NOT NULL FOREIGN KEY REFERENCES "businesses", "day" integer NOT NULL, "open_time" time, "close_time" time ) 

Dans ma logique d’entreprise, je ferais en sorte que chaque «entreprise» dispose d’ au moins 7 heures de travail. ( Au moins parce que Jon Skeet a raison, vous voudrez peut-être passer des heures de vacances.) Bien que vous souhaitiez peut-être assouplir cette contrainte en laissant simplement les «heures ouvrables» fermées pendant plusieurs jours.

Une situation qui n’est pas couverte par ce schéma est plusieurs périodes d’ouverture dans une journée. Par exemple, le pub local est ouvert de 12h00 à 14h30 et de 17h00 à 23h00.

Un guichet de théâtre est peut-être ouvert pour une matinée et une soirée.

À ce stade, vous devez décider si vous pouvez avoir plusieurs entrées pour le même jour ou si vous devez représenter différentes heures dans la même ligne.

Qu’en est-il des horaires d’ouverture qui passent à minuit. Disons qu’un bar est ouvert de 19h00 à 02h00. Vous ne pouvez pas simplement comparer les heures d’ouverture et de fermeture avec l’heure que vous souhaitez tester.

Cela dépend en quelque sorte de ce dont vous avez besoin pour le stocker et de ce à quoi les données réelles peuvent ressembler.
Si vous devez être en mesure de déterminer si l’entreprise est ouverte à un moment donné, il peut être difficile d’interroger le système comme prévu. Plus important encore, est-ce que vous auriez un jour besoin d’une fermeture à la mi-journée?

Certaines options incluent:

  • Un schéma comme celui que vous avez, mais avec la possibilité d’avoir plusieurs périodes pour le même jour. Cela couvrirait la pause déjeuner, mais cela rendrait difficile une requête qui vous donne les heures d’ouverture pour un jour donné, par exemple pour une présentation à un utilisateur.
  • Une approche de style bitmap; “000000000111111110000000” pour 9-5. L’inconvénient de cette approche est que vous devez choisir une granularité spécifique, c’est-à-dire des heures entières ou des demi-heures, voire des minutes. Plus la granularité est fine, plus les données sont difficiles à lire pour un humain. Vous pouvez utiliser des opérateurs binarys pour stocker cette valeur sous la forme d’un nombre unique plutôt que d’une chaîne d’entiers, mais là encore, cela nuit à la lisibilité.

J’ai appris que si vous voulez que le balisage de données google reconnaisse vos données, vous devez suivre ces instructions:

https://schema.org/openingHours

http://schema.org/OpeningHoursSpecification Contient des “dates valides”, ce qui est très utile pour certaines entresockets.

https://schema.org/docs/search_results.html#q=hours

Vous ne devriez pas avoir de clé primaire, à moins que vous n’autorisiez les entresockets à partager les mêmes heures avec la table de jointure. Je ne suis pas sûr du nombre qui serait: p

Avec l’un de mes projets, j’ai utilisé les colonnes:

[uInt] business_id, [uTinyInt] jour, [char (11)] timeRange

Si vous souhaitez prendre en charge OpeningHoursSpecification, vous devrez append validFrom et validThrough.

La plage de temps est formatée comme suit: hh: mm-hh: mm

Voici une fonction qui l’parsing, vous pouvez également modifier cette fonction pour parsingr un seul open / close, si vous les conservez comme des colonnes séparées dans la firebase database.

À la lumière de mon expérience, je vous recommanderais de prévoir plusieurs fois par jour, d’indiquer si elles sont explicitement fermées ce jour-là ou si elles sont ouvertes 24 heures sur 24, 7 jours sur 7. Je disais que si un jour manquait dans la DB, l’entreprise était fermée ce jour-là.

 /** * parseTimeRange * parses a time range in the form of * '08:55-22:00' * @param $timeRange 'hh:mm-hh:mm' '08:55-22:00' * @return mixed ['hourStart'=>, 'minuteStart'=>, 'hourEnd'=>, 'minuteEnd'=>] */ function parseTimeRange($timeRange) { // no validating just parsing preg_match('/(?P\d{1,2}):(?P\d{2})-(?P\d{1,2}):(?P\d{2})/', $timeRange, $matches); return $matches; } 

Pensez à la prise en compte des jours fériés en incluant des champs supplémentaires pour le mois de l’année / le jour du mois / la semaine du mois. La semaine du mois a quelques sous-catégories mineures “last” pourrait par exemple être la semaine 4 ou 5 selon les années.