2008-11-26 8 views
1

J'ai une table SQL qui a un certain nombre de champstype de données fourni par l'utilisateur pour le champ SQL

ID | Valeur | Tapez

Un enregistrement typique peut être: - 1000,10, [entier]

une deuxième rangée peut être: -

1001, foo, [chaîne]

une troisième rangée peut être: -

1002,10/12/2008, [DateTime]

on m'a demandé de regarder ce que pour le moment, chaque fois que nous souhaitons sélectionner ce tableau nous VHA e pour convertir la valeur au type spécifié. Je suis en mesure de faire une refonte de la base de données à ce sujet et je me demande quel est le meilleur itinéraire pour optimiser cela. (SQL 2000).

Répondre

3

Horreurs! C'est le modèle redouté Entity-Attribute-Value (EAV)! Fuyez! Mais sérieusement, en supposant qu'il y ait une raison pour avoir besoin de ce type de modèle, peut-être créer une colonne correctement typée pour chaque type de données?

ID  Type  StringValue  DateValue  NumberValue 
1001  String Foo 
1002  Date      10/12/2008 
1003  Number          123.46 
2

Généralement lors de la conception de tables, vous voulez savoir ce qui va réellement s'y trouver. Avez-vous un nombre distinct de types de données que vous devez prendre en charge? Avez-vous besoin de couvrir les décimales? Une solution possible serait quelque chose comme ceci:

CREATE TABLE dbo.My_Table (
    id   INT NOT NULL, 
    data_type VARCHAR(10) NOT NULL, 
    string_value VARCHAR(100) NULL, 
    int_value INT NULL, 
    date_value DATETIME NULL, 
    CONSTRAINT CK_My_Table_data_type CHECK data_type IN ('int', 'string', 'datetime'), 
    CONSTRAINT PK_My_Table PRIMARY KEY CLUSTERED (id) 
) 
GO 

Vous pouvez ensuite utiliser le type de données pour décider de quelle colonne que vous souhaitez sélectionner ou insérer/mettre à jour. Gardez à l'esprit que vous pourriez avoir des problèmes avec l'utilisation:

SELECT 
    id, 
    CASE data_type 
      WHEN 'string' THEN string_value 
      WHEN 'int' THEN int_value 
      WHEN 'datetime' THEN date_value 
      ELSE NULL 
    END 

SQL Server exige que les types de données tout match pour une colonne retournés. Si vous en sélectionnez un seul à la fois, cela peut fonctionner, mais si vous voulez sélectionner des ensembles de données, vous aurez probablement besoin de faire un cast ou de sélectionner uniquement les lignes où les valeurs data_type sont égales. Cependant, je n'ai pas fait de tests sur tous les scénarios, vous devriez donc jouer avec pour voir ce qui fonctionne et ce qui ne fonctionne pas.

Je le répète, vous devriez revoir la conception de votre application. Il est certainement possible que vous ayez besoin de ce type de fonctionnalité, mais souvent, lorsque je vois ce motif de conception, ce que le frontal veut vraiment, c'est une chaîne qui sera affichée dans l'application. Cette chaîne arrive juste à ressembler à un nombre ou une date à la fois. Si vous voulez réellement exécuter des fonctions spécifiques aux types de données sur les données, il est probable qu'un design moins "flexible" soit nécessaire, mais sans connaître toutes vos exigences, je ne peux pas le dire. C'est juste de mon expérience dans le passé.

EDIT: On dirait que je tape trop lentement et que Tony me frappe dessus. :)

+0

Eh bien, je viens de vous voter quand même! –

Questions connexes