Y a-t-il de bonnes raisons de conserver la date et l'heure dans des colonnes séparées?

9

J'essaie de comprendre la décision de notre fournisseur de logiciels de conserver la date et l'heure dans des colonnes distinctes. Par exemple, lorsque la ligne a été créée ou mise à jour. L'heure et la date sont des colonnes DateTime. Nous utilisons SQL Server 2005.

La base de données contient les données de notre système ERP et je pense que les plus grandes tables contiennent environ 3 millions de lignes. La plupart des tableaux se situent entre 100 000 et 1 000 000 lignes.

Personnellement, je choisirais par défaut un seul DateTime pour un seul horodatage. Cela permettrait des calculs de différence de temps plus faciles et les parties de date et d'heure pourraient être facilement extraites de l'horodatage. Il consommerait également moins d'espace.

La séparation de la date et de l'heure est-elle une mauvaise pratique ou y a-t-il quelque chose de très brillant dans cette conception que je ne comprends pas?

miq
la source

Réponses:

4

Je suppose que c'est un support hérité (c'est-à-dire que dans la version 1 de leur logiciel, ils avaient la date et l'heure dans des champs séparés et ils ont été forcés de le prendre en charge car cela fonctionnait toujours de cette façon).

Cela dit, il n'y a rien de génial à séparer la date et l'heure, donc il ne vous manque rien.

(L'autre option est que vos développeurs de systèmes ERP ne savaient pas qu'un champ datetime peut stocker une date et une heure, mais il est beaucoup plus probable qu'ils avaient une exigence métier pour le faire fonctionner de la même manière que les versions précédentes.)

Simon Righarts
la source
4

Généralement, cela dépend de l'utilisation. Si de nombreuses requêtes joignent des sous-éléments, envisagez plutôt de les stocker ensemble, puis prenez le surdébit de devoir les séparer dans les rares occasions. Bien sûr, le fractionnement est parfois plus complexe (ou impossible): considérez un person_full_nameattribut dont vous avez besoin d'extraire person_family_name. Cela dit, la conversion d'une valeur temporelle est triviale, donc je préférerais généralement stocker la date et l'heure ensemble.

Pensez également à stocker les deux ensemble ET séparément, avec des contraintes (et peut-être des déclencheurs) pour vous assurer qu'ils ne se désynchronisent pas: de cette façon, vous prenez le coup de fractionner / joindre au moment de la mise à jour plutôt qu'au moment de l'interrogation du Les données.

un jour
la source
3

Je ne vois pas beaucoup d'utilité pour cela dans un système opérationnel. Dans un système analytique, vous souhaiterez peut-être une dimension de date distincte avec un grain de «jours» afin que la date soit liée aux rapports de remontée de date, et peut-être une colonne «heure» si vous souhaitez effectuer une analyse par heure pour une raison quelconque .

Vous pouvez également présenter la date et l'heure sous forme de colonnes calculées sur la base d'une colonne datetime principale.

ConcernedOfTunbridgeWells
la source
0

Pour ajouter au commentaire de ConcernedOfTunbridgeWe, il existe un avantage de performance d'interrogation si vous avez une table DateDimension et TimeDimension. Considérez que la table de faits a à la fois une dateDimensionKey et TimeDimensionKey. Si vous voulez trouver le nombre de quelque chose entre 8 heures-17 heures, vous pouvez simplement faire

SELECT COUNT(1) FROM FactTable f Inner Join TimeDimension t on f.TimeDimensionKey = t.TimeDimension WHERE t.Hour BETWEEN 8 AND 17.

Si vous avez ajouté un index à TimeDimensionKey, vous n'aurez besoin que d'une recherche d'index pour le résultat sur votre table de faits pour rechercher des données

Sans la table TimeDimension, vous devrez faire quelque chose comme ce qui suit,

SELECT COUNT(1) FROM FactTable f WHERE DatePart(mintue, f.Date) BETWEEN 8 AND 17

Cela nécessitera probablement une analyse de table car le moteur de base de données doit calculer le résultat pour chaque ligne avant de pouvoir déterminer quelles données peuvent être renvoyées.

dsum
la source