Option 1
Vous stockeriez la disponibilité avec 3 colonnes (en supposant un seul identifiant col pour identifier un utilisateur)
availability_start, availability_end, user_id
recherche basée sur un datetime serait alors quelque chose comme
select
user_id
from
availability
where
desired_datetime > availability_start
and
desired_datetime < availability_end
vous pouvez supprimer des dates antérieures en fonction de la fonctionnalité que vous souhaitez offrir. Évidemment, vous devrez décider jusqu'à quel point dans l'avenir pour stocker les dates en fonction des définitions de date cyclique des gens.
Option 2
Si elle est toujours aussi simple que le choix des jours individuels de la semaine et les heures pour les jours. Vous pouvez stocker des dates cycliques comme
user_id, day_of_week, availability_time_start, availability_time_end
Les heures de début et de fin ne nécessitent aucun composant de date. Recherche basée sur un jour de la semaine et un temps serait quelque chose comme
select
user_id
from
availability
where
desired_day_of_week = day_of_week
and
desired_time > availability_time_start
and
desired_time < availability_time_end
En aparté, il y a des bibliothèques qui aident à la création de ces modèles de date récurrents, où je travaille, nous utilisons this (Java) , il pourrait bien y avoir des implémentations RFC 2445 dans un langage qui vous convient.
Si vous utilisez quelque chose comme ça, alors vous ne stockez pas les dates réelles, mais seulement les détails des modèles de récurrence qui ne vous aideront pas vraiment avec votre problème.Nous stockons ces détails en prenant simplement les valeurs de la définition de récurrence et en les conservant dans le champ db one to one. Vous pouvez également stocker les dates/heures pour une durée définie dans le futur et les recalculer en cas de modification des définitions de récurrence. Cela peut évidemment devenir une opération assez importante en fonction du nombre de plannings des utilisateurs et de la manière dont loin dans le futur, vous voulez stocker des données.
contraintes sont certainement une bonne idée. Mon approche actuelle utilise generate_series mais j'ai peur que pour un milion d'enregistrement ce soit inefficace, les index ne seront pas utilisés. – mlomnicki
Je pense que tout ira bien. Mais, pour des performances maximales ... vous pouvez matérialiser la vue dans une table de disponibilité mise en cache et, plutôt que de la mettre à jour en une fois, utiliser des déclencheurs pour insérer ou mettre à jour de manière sélective en fonction de quelle règle a été modifiée et comment. Ensuite, vous pouvez effectuer une requête sur une vue matérialisée pour obtenir la disponibilité tout en conservant les règles séparément. Avant d'emprunter cette route, j'exécuterais au moins une ANALYZE EXPLAIN avec la vue pour mesurer la performance. –
c'est certainement la meilleure proposition. Cependant, je n'ai rien trouvé à propos de la «table de disponibilité mise en cache». Comment le gérer dans postgres? Donnez-moi un lien ou des instructions de base, s'il vous plaît. – mlomnicki