IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MS SQL Server Discussion :

stockage de données dans une table générique.


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 64
    Par défaut stockage de données dans une table générique.
    Bonjour,
    J'ai une question concernant l'architecture d'une table de base de données.

    Nous devons stocker dans une table des données provenant de différentes sources. Chaque source ne possède pas le même format ni même les mêmes paramètres.
    La solution adoptée jusqu'à aujourd'hui était une table où toutes les colonnes sont générique du style:
    Champ1, Champ2, Champ3, etc…
    Vous avez tout de suite compris que de nombreuses colonnes restent vides. Je ne connais pas l'incidence sur les performance???

    Afin d'optimiser cette table, j'ai opté pour la solution suivante:
    une table avec: Id, Numéro de ligne, clé, valeur. (Numéro de ligne correspond en fait à une ligne dans le type de table décrit ci-dessus. si on prend Champs1, champs2 et champs3 comme paramètre, on aura 3 clés pour un numéro de ligne)
    id1 - 1 - champs1 - value1
    id2 - 1 - champs2 - value2
    id3 - 1 - champs3 - value3
    id4 - 2 - champs1 - value4
    id5 - 2 - champs2 - value5
    id6 - 2 - champs3 - value6
    id7 - 3 - champs1 - value7
    id8 - 3 - champs2 - value8
    etc...

    mais pour un autre fichier de data, on aura:
    id100 - 12 - champs5 - value1
    id101 - 12 - champs6 - value2
    id102 - 12 - champs7 - value3
    id103 - 12 - champs8 - value4
    id104 - 13 - champs5 - value5
    id105 - 13 - champs6 - value6
    id106 - 13 - champs7 - value7
    id107 - 13 - champs8 - value8
    etc...

    Ainsi, on n'a plus de colonne non utilisée. Par contre, les requêtes en sont devenues plus complexes. (Je précise que le nom des champs est stocké dans une seconde table vers laquelle on fait référence)
    Par exemple, si on veut la valeur de champs3 si champs1 = 'TOTO' et Champs2='24'. Dans le premier cas, c'est facile. Dans le second, il faut faire bien plus de requêtes. (extraire le numéro de ligne où champs1 = 'TOTO', dans ces numéros de lignes, extraire ceux où champs2=24 puis récupérer la valeur de champs3 pour les numéro de ligne restant.

    D'un côté, on optimise le stockage (et encore, je suis pas sûr!), de l'autre, on optimise le calcul. Quel modèle de table préconisez vous?

    Je précise que les requêtes SQL sont exécutées à l'aide d'ADO.net (appli c#) vers SQlserver2005.
    Merci de m'apporter vos lumières.

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Bonjour,

    Vous avez tout de suite compris que de nombreuses colonnes restent vides. Je ne connais pas l'incidence sur les performance???
    Cela dépend de l'utilisation qui est faite de vos tables :

    - soit vous importez les données des sources directement dans celles-ci, alors qu'elles sont utilisées par des applications
    - soit il s'agit de tables "tampon", à partir desquelles vous effectuez un traitement postérieur pour peupler d'autres tables.

    Dans le premier cas, vous stockez, comme vous le dites, dans des colonnes dont les valeurs sont souvent absentes.
    Même si je comprends bien que cette "modélisation" provient directement du mappage des colonnes de vos tables avec les champs de vos sources, vous avez tout intérêt à passer au modèle auquel vous êtes en train de réfléchir.
    En effet le stockage de vos informations n'en sera que plus riche, car vous stockerez plus d'information dans vos pages (le stockage de NULL coûte un peu d'espace).
    Mais surtout, en indexant proprement vos colonnes, vous obtiendrez un gain de performances qui peut être assez significatif.

    extraire le numéro de ligne où champs1 = 'TOTO', dans ces numéros de lignes, extraire ceux où champs2=24 puis récupérer la valeur de champs3 pour les numéro de ligne restant.
    Si vous êtes sous SQL Server 2000, vous pouvez écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    SELECT Id, numeroDeLigne, cle, valeur
    FROM dbo.maTable AS T
    JOIN (
    		SELECT numeroDeLigne
    			FROM dbo.maTable
    			WHERE clé = 'champ1'
    			AND valeur = 'TOTO'
    		UNION
    			SELECT numeroDeLigne
    			FROM dbo.maTable
    			WHERE clé = 'champ2'
    			AND valeur = '24'
    	)
    ON C.numeroDeLigne = T.numeroDeLigne
    AND T.clé = 'champ3'
    Si vous êtes sous SQL Server 2005 ou 2008, vous pouvez écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    WITH
    	CTE AS
    	(
    			SELECT numeroDeLigne
    			FROM dbo.maTable
    			WHERE clé = 'champ1'
    			AND valeur = 'TOTO'
    		UNION
    			SELECT numeroDeLigne
    			FROM dbo.maTable
    			WHERE clé = 'champ2'
    			AND valeur = '24'
    	)
    SELECT Id, numeroDeLigne, cle, valeur
    FROM dbo.maTable AS T
    JOIN CTE AS C
    	ON C.numeroDeLigne = T.numeroDeLigne
    	AND T.clé = 'champ3'
    Il est vrai que cela complexifie les requêtes, et je suppose que vous ne pouvez pas connaître à l'avance les valeurs de la colonne clé dont vous allez avoir besoin.
    Il peut alors être intéressant de passer à du SQL dynamique (construction de la requête au fil de l'eau suivant les paramètres, stockage dans une variable de type chaîne de caractères, et exécution à l'aide de sp_executeSQL pour profiter de la ré-utilisabilité du cache de procédures) ...

    @++

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 64
    Par défaut
    Bonjour,
    En effet, c'est le premier cas de figure que j'utilise:
    - soit vous importez les données des sources directement dans celles-ci, alors qu'elles sont utilisées par des applications

    Il est vrai que cela complexifie les requêtes, et je suppose que vous ne pouvez pas connaître à l'avance les valeurs de la colonne clé dont vous allez avoir besoin.
    Et bien si, je connais les valeurs clés à l'avance. C'est comme si je stockais dans cette table des données de différents clients et que cette table soit interrogée par un moteur personnalisé au client. Dans ce moteur personnalisé, je connais les clés à interroger.


    Votre réponse me conforte dans mon idée initiale.
    Merci bcp.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 07/02/2006, 13h26
  2. [MySQL] Modifier une donnée dans une table
    Par leloup84 dans le forum PHP & Base de données
    Réponses: 27
    Dernier message: 02/02/2006, 13h25
  3. Inserer des données dans une table access SQL
    Par ouellet5 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 23/11/2005, 21h11
  4. Réponses: 2
    Dernier message: 15/06/2005, 17h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo