Je pense que ces types de questions sont intéressants parce que chaque fois que vous concevez une base de données, il est important de connaître les exigences de l'application qui interagira avec votre base de données.
Cela dit, tant que l'application peut faire référence à plusieurs tables, je pense que la réponse de Chris Steele est un bon début que je vais construire sur ...
Je veux 2 tables. Le premier tableau divise un jour en parties (tranches), en fonction des besoins de l'entreprise. Chaque tranche serait la clé primaire de cette table. Personnellement, je choisirais des tranches de 15 minutes qui équivaut à 96 parties de jour. Chaque partie journalière de cette table aurait un "début de bloc" et un temps de "fin de bloc" qui seraient référencés par l'application de planification lorsqu'un utilisateur a sélectionné une heure de début réelle et une heure de fin réelle pour la réunion. L'application aurait besoin d'appliquer une logique telle que deux « OU » entre 3 « et » déclarations afin de voir si un particulier BlockID sera inséré dans votre table de rendez-vous:
- début réel> = démarrage du bloc et réelle début < bloc fin
- fin réelle> début du bloc et la fin réelle < fin du bloc
- début réel < début du bloc et la fin réelle> fin du bloc
Cela varie légèrement de la réponse de Chris Steele dans e il utilise deux tables. Les horodatages réels peuvent toujours être insérés dans votre table d'applications, mais la logique ne leur est appliquée que lors de la comparaison avec la table TimeBlocks. Dans ma table de rendez-vous, je préfère les dates de rupture dans différentes parties pour une analyse multi-plateforme (notre organisation utilise SGBDR multiples ainsi que SAS pour l'analyse):
CREATE TABLE TimeBlocks (
blockID Number(X) NOT NULL,
blockStart DateTime NOT NULL,
blockEnd DateTime NOT NULL,
primary key (blockID)
);
CREATE TABLE Appointments (
mgrID INT NOT NULL,
yr INT NOT NULL,
mnth INT NOT NULL,
day INT NOT NULL,
blockID INT NOT NULL,
ApptStart DateTime NOT NULL,
ApptEnd DateTime NOT NULL
empID INT NOT NULL,
primary key (mgrID, yr, mnth, day, blockID),
CONSTRAINT timecheck
check (ApptStart < ApptEnd)
);
Pour appliquer cette contrainte, il faut un déclencheur ou une fonction définie par l'utilisateur (au moins dans la plupart des bases de données). –
Si c'est vraiment une question SQL Interview, vous pouvez répondre simplement que, au moment de la conception, ce n'est pas possible. –
Vous pouvez le faire dans SQL Server si vous modélisez également les périodes de temps libre, avez des références croisées qui relient chaque période de temps à son prédécesseur et successeur, et écrivez des instructions MERGE vraiment horribles pour gérer l'insertion/suppression (où, le plus souvent, vous devez fractionner une période libre en en mettant une à jour, en insérant une nouvelle ligne et en insérant le nouveau rendez-vous, le tout dans une seule instruction afin que les clés étrangères restent satisfaites). C'est faisable mais souvent les coûts sont plus élevés que la valeur. –