Question

Je dois stocker plusieurs valeurs de date dans un champ de base de données. Ces valeurs seront liées à un " Utilisateur " de telle sorte que chaque utilisateur aura son propre ensemble unique de ces plusieurs valeurs de date.

Je pourrais utiliser une relation un-à-plusieurs ici, mais chaque utilisateur aura exactement 4 valeurs de date qui leur sont liées. Je pense donc qu'un tableau un-à-plusieurs serait excessif besoin d'interroger contre eux, j'aurais besoin de ces 4 valeurs dans différents domaines, par exemple MyDate1 MyDate2 ... etc., mais la commande SQL pour le récupérer devra vérifier 4 valeurs à chaque fois.

La relation un à plusieurs serait donc probablement la meilleure solution, mais existe-t-il une solution plus performante / plus propre / plus rapide / autre? Est-ce que je le conçois correctement?

La plate-forme est MS SQL 2005 mais la solution sur n'importe quelle plate-forme conviendra, je recherche principalement des techniques de conception de base de données appropriées.

EDIT: Les 4 champs représentent 4 instances de la même chose.

Était-ce utile?

La solution

Si vous le faites sous la forme de quatre champs distincts, vous n'êtes pas obligé de le rejoindre. Pour éviter que la syntaxe de la requête ne soit trop horrible, vous pouvez écrire:

SELECT * FROM MyTable WHERE 'DateLiteral' IN (MyDate1, MyDate2, MyDate3, MyDate4);

Comme mentionné dans les commentaires, l’opérateur IN est assez spécifique en ce qui concerne les champs de date (jusqu’à la dernière seconde). Vous pouvez toujours utiliser les fonctions date / heure sur la sous-requête, mais BETWEEN est inutilisable:

SELECT * FROM MyTable WHERE date_trunc('hour', 'DateLiteral') 
IN (date_trunc('hour', MyDate1), date_trunc('hour', MyDate2), date_trunc('hour', MyDate3), date_trunc('hour', MyDate4));

Autres conseils

Certaines bases de données telles que Firebird ont un type de données array, qui correspond exactement à ce que vous avez décrit. Il est déclaré quelque chose comme ceci:

alter table t1 add MyDate[4] date;

Pour ce que cela vaut, la conception normalisée consisterait à stocker les dates sous forme de lignes dans une table dépendante.

Le stockage de plusieurs valeurs dans une seule colonne n’est pas une conception normalisée; La normalisation signifie explicitement que chaque colonne a exactement une valeur.

Vous pouvez vous assurer que pas plus de quatre lignes sont insérées dans la table dépendante de cette façon:

 CREATE TABLE ThisManyDates (n INT PRIMARY KEY);
 INSERT INTO ThisManyDates VALUES (1), (2), (3), (4);

 CREATE TABLE UserDates (
   User_ID INT REFERENCES Users,
   n INT REFERENCES ThisManyDates,
   Date_Value DATE NOT NULL,
   PRIMARY KEY (User_ID, n)
 );

Cependant, cette conception ne vous permet pas de rendre les valeurs de date obligatoires.

Que diriez-vous d'avoir 4 champs en même temps que l'ID utilisateur (si vous êtes sûr, cela ne dépassera pas cela)?

Créez quatre champs de date et stockez les dates dans les champs. Les champs de date peuvent faire partie de votre table d'utilisateurs ou se trouver dans une autre table jointe à la table d'utilisateurs dans une relation un à un. C'est votre appel.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top