2011-07-21 2 views
1

Je développe une application qui gardera une trace de diverses informations sur les médecins qui sont affiliés à mon lieu de travail. Une chose que nous suivons, c'est leur disponibilité par heure (matin, après-midi et soir) pour chaque jour de la semaine (lundi - dimanche). En outre, nous allons stocker un commentaire facultatif sur la disponibilité des praticiens, quelque chose comme "Ne fonctionne pas pendant la pleine lune."Comment stocker la disponibilité du praticien (jour de la semaine et heure de la journée) dans SQL Server

Le formulaire d'entrée/affichage pour cette information sera le tableau avec les jours de la semaine comme en-têtes de colonne et les heures du jour comme en-têtes de ligne. Des cases à cocher indiqueront si le praticien est disponible pendant la période spécifiée.

J'ai du mal à trouver comment stocker ces informations dans la base de données. La solution la plus évidente pour créer une table avec 24 colonnes (21 pour 7 jours * 3 fois, 1 comme clé primaire, et 1 pour la clé étrangère référant au praticien, et 1 pour le commentaire). Ce qui est une table de merde, mais au moins c'est facile à sélectionner et à mettre à jour.

Une autre solution consiste à créer une table avec des attributs:

  • practitioner_id :: int (clé étrangère et de clé primaire)
  • day_of_week :: int (clé primaire) (pourrait aussi être Enum, mais je ne pense pas que SQL Server a ce type)
  • matin :: bit
  • après-midi :: bit
  • soir: bit

C'est une table moins laide, mais ce sera difficile à mettre à jour, car je devrais avoir une mise à jour séparée pour chaque jour de la semaine. Le commentaire devra également être stocké en dehors de cette table. Une autre solution peut être d'avoir une colonne pour chaque jour de la semaine, le type de données étant BLOB (ou quelle que soit la version de SQL Server). Et puis stocker les informations de temps comme un tableau de taille trois. Mais je suis sûr que cela casse toutes les règles d'une bonne conception de base de données. Cela limiterait également l'efficacité des requêtes select.

Des idées sur la façon de stocker ces données?

EDIT:

Pour clarifier les choses, nous ne sommes intéressés à ce que leur horaire de la semaine moyenne est. Des choses comme les vacances et les vacances peuvent être ignorées. Sur le frontal, les informations seront affichées sous la forme d'une grille, avec des colonnes représentant les jours de la semaine et des lignes représentant les heures du jour.

Il se peut que cette information doive être recherchée. Par exemple, nous voudrons peut-être faire un rapport de tous les pratiquants qui travaillent le lundi soir.

+0

Si un praticien est disponible le lundi après-midi, est-ce que cela veut dire qu'il sera disponible CHAQUE SIMPLE lundi après-midi? Donc, vous n'avez pas besoin de prendre en compte les vacances, les vacances, etc? De toute façon, ne pensez même pas à des tableaux ou des blobs. Ce sont des informations discrètes et appartiennent à des colonnes individuelles - pensez-vous vraiment qu'un blob ou un tableau sera plus facile à gérer? Pourquoi? –

+0

Avez-vous besoin d'afficher l'horaire, ou vérifiez si un moment donné est dans la disponibilité d'un praticien, ou autre chose? I.e, quelle est l'application? –

+0

Personnellement, je préférerais la solution pour stocker 24 colonnes (tous les champs de bits). Un enregistrement pour chaque praticien semble assez bon - regarder vers l'avenir - toute déclaration choisie sera beaucoup plus facile avec une rangée pour chaque personne - que jusqu'à sept lignes pour chacun! –

Répondre

3

je suggère la conception suivante, un grand nombre à plusieurs. Quand je conçois, j'utilise en regardant la durée de vie du système et quels sont les changements probables à ajouter.Cette conception nécessite un peu plus d'effort à l'avance, mais permet d'économiser des efforts au fil du temps.

Un enregistrement est uniquement écrit dans la table Practises_to_schedules lorsqu'un praticien est disponible. Cela pourrait réduire la taille de la table et entraîner un plus grand nombre d'enregistrements par page de données/d'index.

Un avantage de la conception ci-dessus est qu'elle ne code pas en dur le «découpage» de l'ordonnancement en cours dans le schéma. Si à l'avenir, le système devait décomposer les «morceaux» en heures, le schéma de la table ne changerait pas, juste le contenu des tables.

Un autre avantage est que cela se prête à la notion de dates effectives. Un médecin est disponible tous les lundis matins, mais il n'est pas disponible la semaine prochaine. Ajoutez effective_date et end_date à la table de relation et la fonctionnalité est prise en charge.

Ceci se prête à un schéma d'indexation relativement simple. Deux index sur practic_to_schedules et vous pouvez rapporter sur la plupart des options efficacement. En fonction des lectures les plus courantes, vous pouvez choisir l'ID à utiliser pour l'index clusterisé.

+0

Je souhaite que je pourrais upvote plus d'une fois. –

+0

Les exigences ont changé, et maintenant nous ne faisons que suivre les jours de la semaine, et non les heures de la journée. Mais si les exigences initiales étaient encore en place, ce serait la meilleure réponse. – Morglor

1

Sons comme votre conception seconde table répondra mieux à vos besoins:

practitioner_id :: int (foreign key and primary key) 
day_of_week :: int (primary key) 
morning :: bit 
afternoon :: bit 
evening :bit 
+0

Il est préférable de garder les données plus normalisées que la version 21 colonnes dénormalisée de l'OP. Rappelez-vous que votre base de données n'a pas besoin de ressembler à la forme des modèles (classes) que vous codez. Vous avez juste besoin d'un moyen de mapper entre les modèles et les bases de données. Il se peut que vous ayez besoin de plusieurs modèles pour l'édition, différents de ceux que vous utilisez pour les rapports. –

Questions connexes