Comment dois-je modéliser un champ qui peut contenir à la fois des valeurs de chaîne dans SQL Server 2005?

StackOverflow https://stackoverflow.com/questions/34398

  •  09-06-2019
  •  | 
  •  

Question

J'ai une nouvelle table de base de données j'ai besoin de créer...
Logiquement, il contient un ID, un name, et un "value".
Cette valeur peut être soit numérique ou une chaîne de caractères dans la nature.

Je ne pense pas que je veux juste faire le champ d'un varchar, parce que je veux aussi être capable de faire une requête avec des filtres comme WHERE value > 0.5 et tel.

Quelle est la meilleure façon de modéliser ce concept dans SQL Server 2005?

EDIT: Je ne suis pas opposé à la création de plusieurs champs (ici l'une pour les nombres, l'un pour les non-nombres), mais depuis ils sont tous vraiment le même concept, je n'étais pas sûr que c'était une excellente idée.
Je suppose que je pourrais créer des champs distincts, puis avoir une vue de ce genre de se fige dans une logique unique de la colonne.

Aucun avis sur cette question?

Ce que je veux réaliser est vraiment assez simple...habituellement, ces données seront juste aveuglément affichées dans une grille-type de point de vue.
Je veux aussi être capable de filtrer sur les valeurs numériques dans cette grille.Ce tableau sera à la fin dans les dizaines de millions d'enregistrements, donc je ne veux pas me peindre dans un coin, les performances des requêtes.
Que les performances des requêtes est ma principale préoccupation.

Était-ce utile?

La solution

Votre question avec le mélange de données peut être la façon dont Sql 2005 sortes de données texte.Ce n'est pas "naturelle" de tri.

Si vous avez un champ de type varchar et vous ne:

where value > '20.5'

Des valeurs comme la "5" sera dans votre suite (comme dans un caractère de tri "5" vient après "20.5")

Vous allez être mieux avec des colonnes distinctes pour le stockage.

Utilisation Fusionner les fusionner en une seule colonne si vous avez besoin d'fusionnées dans vos résultats:

select [ID], [Name], Coalesce( [value_str], [value_num] )
from [tablename]

Autres conseils

Un bon moyen d'obtenir la prise en charge des requêtes que vous voulez est d'avoir deux colonnes:numvalue qui stocke un nombre et textvalue qui stocke des caractères.Ils doivent accepter les valeurs null ou au moins avoir quelques défaut qui représente aucune valeur.Votre application peut ensuite décider de la colonne de stocker sa valeur et qui, à un congé sans valeur.

Si vous souhaitez stocker numérique et chaîne de valeurs dans la même colonne, je ne suis pas sûr que vous pouvez éviter de faire beaucoup de jette et convertit lors de l'utilisation de cette colonne comme un filtre de requête.

deux colonnes.

Table: (ValueLable as char(x), Value as numerica(p,s))

Je ne pense pas que c'est possible d'avoir une colonne avec les deux varchar et le type int.Vous pourriez économiser votre valeur en tant qu'un varchar et la convertir en int lors de votre requête.Mais de cette façon, vous pourriez obtenir une exception, si votre valeur ne contenir n'importe quel caractère.Qu'essayez-vous de réaliser?

Si vous voulez être en mesure de tenir une chaîne de caractères, je pense que vous avez à donner à une colonne de type varchar, ou similaire.

Une autre solution pourrait être d'avoir 2 ou 3 colonnes au lieu d'une valeur de colonne.Peut-être avez trois colonnes, value_type (enum entre "nombre" et "chaîne"), number_value, valeur_de_la_chaîne.Ensuite, vous pouvez reconstruire cette requête

WHERE value_type = 'number' AND number_value > 0.5

Je ne pense pas que vous allez être en mesure de se déplacer à l'aide de type VARCHAR ou NVARCHAR comme votre type de données.Avec un mélange de données comme vous le décrivez, vous aurez à tester la valeur lorsque vous tirez sur le terrain de la base de données et effectuer la FONTE ou de CONVERTIR en fonction du type de données.

Je suppose que je pourrais créer des champs distincts, puis avoir une vue de ce genre de se fige dans une logique unique de la colonne.Aucun avis sur cette question?

Il dépend de la source de données.Si vous êtes l'obtention des données auprès des utilisateurs (ou un autre système) dans certains de forme libre et d'une manière et ne vous souciez pas vraiment de quel type de données il est alors le meilleur moyen de stocker de la plus manière générique (varchar, etc).Si les données entrantes sont plus structurés, plus vous vous souciez de cette structure, alors il est plus logique de garder que la structure de la base de données en utilisant des champs distincts.

Du point de vue de SÉLECTIONNER n'a pas vraiment d'importance;vous pouvez stocker de la manière et de lire le même schéma.Une fois que vous obtenez dans les filtres (comme vous le mentionnez) les choses deviennent un peu plus poilu, mais encore facilement faisable.Cependant, vous ne mentionnez pas si vous avez besoin d'être en mesure de mettre à jour ces données et, si oui, si vous avez besoin d'appliquer de validation sur les données.

De les sons de celui-ci, vous avez besoin d'effectuer différents types de recherches basées sur le "type" de la valeur à stocker.En tant que tel, il peut être judicieux d'ajouter un champ de Type, de sorte que tous les filtres peuvent être rapidement limité pour le type de valeurs que vous vous souciez.Remarque, par Type, je veux dire un de plus logique, de l'application, le Type;pas le type de données stockées.

Ma recommandation serait d'utiliser un seul champ avec un Type de colonne si vous avez besoin pour facilement prendre en charge les Mises à jour ou utiliser plusieurs champs (ou des tables, si ceux-ci sont totalement différents ensembles de données) si la Sélection et le filtrage est tout ce qui est nécessaire.

Vous pourriez envisager d'utiliser deux colonnes, l'une "chaîne" et un "numérique" (quelles que soient les variantes de ceux qui sont appropriées) avec la "chaîne" de la colonne NON NUL, et le "numérique" de la colonne permettant de valeurs NULL.Lors de l'insertion d'une valeur, toujours remplir la "chaîne" de la colonne indpendent du type, cependant, si la valeur est numérique, ÉGALEMENT la stocker dans le "numérique" de la colonne.Maintenant que vous avez construit dans l'indicateur pour le type (si le "numérique" de la colonne est remplie, il est numérique, si ce n'est que c'est une corde), on peut toujours tirer la valeur pour l'affichage de la "chaîne" de la colonne, et on peut utiliser le "numérique" de la valeur dans les calculs ou pour un bon numérique de tri et de comparaison en tant que de besoin.Vous pouvez toujours ajouter une troisième colonne indiquant le type de la valeur, mais cette approche élimine le besoin.Notez que vous pourriez envisager de maintenir le numérique et les valeurs de chaîne à l'aide d'un ensemble d'INSÉRER et mettre à JOUR les déclencheurs.

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