2012-11-20 1 views
9

J'essaie de créer une application qui devra utiliser les heures d'ouverture et permettre aux utilisateurs d'effectuer une recherche (pensez à Yelp comme cela).Quelle est la bonne approche pour la conception de base de données pour les heures d'ouverture?

Je discute de ce qui est un bon design pour cela. La seule chose que je peux penser est d'avoir une table de base de données avec une clé étrangère à une table "Companies" qui répertorie un jour de la semaine et les heures d'ouverture et de fermeture.

Tbl_Hours_Operation 
- day_of_week 
- open_time 
- close_time 
- company_id 

Y a-t-il une autre approche qui fonctionnerait et serait plus efficace?

+2

Ça semble bon jusqu'à présent ... qu'en est-il des vacances? –

+4

Personne ne passe des vacances. Problème résolu! – LittleBobbyTables

+0

Il semble que vous vouliez avoir un ensemble d'heures standard assez fermé que vous avez conçu, et vous voudriez avoir un ensemble d''exceptions' plus souvent changeant pour couvrir des choses comme les heures de vacances – David

Répondre

8

deux tables:

operational_hours (company_id, day_of_week, open_time, CLOSE_TIME)

operational_hours_special (company_id, date, open_time, CLOSE_TIME)

vous devez joindre à la deux tables pour vérifier les heures spéciales.

Est-ce que l'une de vos entreprises sera fermée pour le petit déjeuner, le déjeuner, le dîner, siesta? Si oui, je voudrais ajouter:

operational_hours_closed (company_id, day_of_week, CLOSE_TIME, open_time)

encore plus amusant JOIN s!

+3

Pour la fermeture pour le déjeuner, la même chose peut être accomplie en permettant à une entreprise d'avoir plusieurs entrées par 'day_of_week' dans la table' operational_hours'. Donc, au lieu d'une jointure avec un ensemble d'heures de fermeture, seulement deux enregistrements des heures d'ouverture. – David

+1

Et vous pourriez facilement construire une vue en plus de celle qui vous donnerait les bonnes heures pour n'importe quelle date arbitraire. –

+0

@DanJ Excellent point! – Kermit

0

Votre approche semble solide. Juste quelques petites choses à noter:

Assurez-vous d'indexer cette table sur Company_Id et DayOfWeek_Id (et dans cet ordre). Il devrait également (éventuellement) prendre en charge plusieurs entrées par jour de la semaine, dans le cas où l'entreprise ferme pendant la journée ou si elle est ouverte pendant la nuit.

CompanyDayOfWeek 
---------------- 
Company_Id  INT/BIGINT FK->Company table 
DayOfWeek_Id INT   (this can be a FK or just a hard coded list of IDs) 
Open_Time  TIME   if your DB supports a dateless time data type 
Close_Time  TIME 
Questions connexes