web-dev-qa-db-fra.com

Meilleure pratique pour stocker les dates Group par une paire de clés d'année mois

Je fais un service qui doit contenir des données regroupées et calculées par une combinaison mensuelle de mois. Je sais comment calculer les données et le mettre sur une nouvelle table. Mais je suis confondre quel type de type de données je devrais utiliser pour stocker une valeur mensuelle. Voici ce que j'ai envisagé.

  1. Deux colonnes entier une pour une année autres pour un mois (clairement à comprendre et fort pour manipuler (quiconque utilise cette table peut facilement utiliser des gammes et des commandes), mais je pense que cela prendrait plus d'espace qu'une autre solution.
  2. Utilisez un champ de date et stockez toujours une date pendant le mois entier. (Difficile à expliquer aux utilisateurs comment cela fonctionne et comment créer des clauses)
  3. Une colonne Varchar (7) et poser des piqûres comme 2012-02,2013-01. Pour moi, c'est facile à comprendre mais difficile à manipuler.

Whick je devrais choisir? ou y a-t-il une autre solution. Quelqu'un peut-il suggérer en fonction de la performance qui va être une bonne solution, car la plupart des requêtes vont utiliser la plage de données dans la solution et mon nouveau tableau auront environ 2-5 millions d'enregistrements.

6
adopilot

J'utiliserais un champ de date avec le 1er d'un mois et une contrainte de contrôle pour vous assurer qu'il reste la journée 1.

Cela le conserve dans le format de date/heure natif (qui est votre observation sur l'option 3)

L'option 1 nécessiterait moins de stockage, mais complique des comparaisons. Et 5 millions de lignes ne sont pas beaucoup: vous utilisez moins de stockage mais ajoutez du code et de la complexité de la requête

9
gbn

Je pense que vous devez choisir une (ou plus) options en fonction de la manière dont les données doivent être récupérées.

Pour 5 millions d'enregistrements, l'espace ne devrait vraiment pas être votre principale préoccupation. Pour chacune de vos options, voici les avantages et les inconvénients pour la récupération :

((1) deux colonnes entier : C'est une excellente approche à utiliser si vous devez comparer des mois à partir de différentes années. L'extraction d'un mois et de tri par année sera beaucoup plus rapide si vous indexez l'année et le mois séparément. L'option 1 est la meilleure s'il s'agit d'un mode important ou fréquent d'utiliser les données. D'autre part, ce mode est terrible pour extraire des gammes autres que des années et des mois. Par exemple, ce n'est pas bon pour les gammes que les années de traverses. La clause WHERE pourrait devenir plus compliquée que vous l'aimez idéalement que cela soit lorsque la date des chaînes de la date des limites du calendrier Calendrier. (Pensez de novembre 2011 à février 2012.)

2) Champ de date : Vous et GBN ont tous deux identifié de bons points à propos de ce format. Il est également bon de trier chronologiquement et d'extraire des gammes de mois. Il s'agit de la représentation la plus compacte (seulement 3 octets). Ce n'est pas bon du tout pour comparer des mois dans différentes années et ce n'est pas une idée d'affichage des écrans et des rapports.

(3) Char (7) Champ de Yyyy-MM : Notez que si vous êtes vraiment préoccupé par l'espace (et vous ne devrait pas être Dans votre cas), vous pouvez utiliser char au lieu de varchar car chaque élément sera d'une longueur connue. L'utilisation de yyyy-mm est bonne pour le tri et le filtrage des gammes. Ce n'est pas aussi bon que (2) pour l'espace, mais il vaut mieux l'affichage et la simplicité de la clause de l'endroit où vous n'avez besoin d'extraire comme des mois à travers des années.


Vous avez peut-être remarqué qu'il existe une différence entre (1) et (2)/(3) en ce qui concerne la nature de l'extraction que vous devez faire. Si vous devez faire les deux mois/an sur l'année et les extractions de plage de mois, aucune de ces options n'est parfaite. Si tel est le cas, je suggérerais que vous envisagez d'utiliser une combinaison de (1) et (2) ou (3) - je choisirais moi-même, car j'apprécie la facilité d'affichage/utilisation sur le stockage espace. Si vous utilisez une combinaison, faites une ou plusieurs colonnes calculées et indexez-la pour une récupération efficace.

2
Joel Brown

Considérons la modélisation comme une période avec deux valeurs de date - Date de début et date de fin - à l'aide de la représentation ouverte fermée (le "ouvert" indique que la date de fin ne se produit pas dans la période).

Par exemple, le mois en cours (mars 2012) serait modélisé à l'aide de la ligne

(start_date, end date) VALUES ('2012-03-01T00:00:00', '2012-04-01T00:00:00')
1
onedaywhen

Si vous avez également la date complète dans la table et utilisez uniquement l'une pour agrégation uniquement, faites une fonction qui crée une valeur normalisée et parfaitement distribuée (par exemple, des mois depuis janvier 1970 ") à compter de la date et créez un indice sur le résultat de cette fonction pour accélérer le processus d'agrégation.

0
Simon Richter