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 :

Comment modéliser des types d'objet ?


Sujet :

MS SQL Server

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2009
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 10
    Points : 11
    Points
    11
    Par défaut Comment modéliser des types d'objet ?
    Bonjour,

    J'ai une table "Images" qui contient les informations d'images téléchargées par des utilisateurs.

    L'utilisateur peut télécharger deux types d'images : Une images personnelle, ou une image partagée.

    J'aimerais savoir comment il est possible de faire un design de tables en évitant ...

    1. ... de créer deux tables à contenu identique portant un nom différent (ImagesPerso et ImagesPartagees).

    2. ... de faire des requêtes promptes à l'erreur en devant spécifier une chaîne de caractères pour les identifier (exemple : SELECT * FROM Images WHERE ImageType = "partagee") dans le cas où tout serait dans la même table.

    3. ... d'avoir une table ImageType contenant que deux entrées ("partagee" et "personnelle") et d'être forcé de faire une requête du genre [...] WHERE ImageType = 2 (un numéro n'est pas très explicite ...)

    Est-ce que je dois absolument me créer une énumération dans mon code (ex.: 1 = Partagee, 2 = Perso) pour être en mesure de faire des requêtes du genre [...] WHERE ImageType = ImageType.Partagee ?

    J'espère que mon explication n'est pas trop nébuleuse ...

    Merci d'avance.

  2. #2
    Membre à l'essai
    Inscrit en
    Août 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 9
    Points : 12
    Points
    12
    Par défaut
    Tu peux créer une table imagetype (id_type, type)
    et une table Image (id_Image, ...,id_type) dans ce dernier id_type et la clé étrangére et on a une relation de 1 à plusieurs

    SELECT *
    FROM image
    where id_type in (
    SELECT id_type
    FROM imagetype
    WHERE type = "partagee"
    );

    Je ne suis plus sur pour les parenthéses tu pourra vérifier sur le net

  3. #3
    Membre à l'essai
    Inscrit en
    Juillet 2009
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 10
    Points : 11
    Points
    11
    Par défaut
    En fait c'est ce que je tenais à éviter, de devoir entrer une string en clair dans ma requête.

    J'ai trouvé deux solutions :

    1. Dans mon code métier j'implémente une énumération qui réflète les différents types.

    2. Entity Framework offre l'héritage d'entités à partir des tables de la base de données.

    J'ai opté pour la solution 2. Je m'instruis sur Entity Framework dès maintenant.

    Merci pour ta réponse.

  4. #4
    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 : 43
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT *
    FROM image
    where id_type in (
    SELECT id_type
    FROM imagetype
    WHERE type = "partagee"
    );
    Pourquoi ne pas avoir écrit une jointure ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT I.mesColonnes
    FROM dbo.image AS I
    JOIN dbo.imagetype AS T
    	ON I.id_type = T.id_type
    	AND T.type = 'partagee'
    Si vous êtes absolument certain que vous n'aurez que deux types d'images à gérer, vous pouvez par exemple ajouter une colonne de type BIT, mais ce n'est pas très pérenne.

    Sinon vous pouvez écrire une procédure stockée pour chaque type d'image, qui se chargera de faire les vérifications qui s'imposent à la place de votre application.
    Pour voir les avantages procurés par l'utilisation d'une procédure stockée, c'est par ici.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE PROCEDURE PsGetImagePerso
    	@mesParametres monType
    AS
    BEGIN
    	SELECT I.mesColonnes
    	FROM dbo.maTableimage AS I
    	JOIN dbo.imagetype AS T
    		ON I.id_type = T.id_type
    		AND T.type = 'perso'
    END
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE PROCEDURE PsGetImagePartagee
    	@mesParametres monType
    AS
    BEGIN
    	SELECT I.mesColonnes
    	FROM dbo.maTableimage AS I
    	JOIN dbo.imagetype AS T
    		ON I.id_type = T.id_type
    		AND T.type = 'partagee'
    END
    Depuis votre application, suivant ce que l'utilisateur choisit, vous exécutez l'une ou l'autre des procédures stockées.

    @++

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

Discussions similaires

  1. [MCD] Comment modéliser des objets ayant des modèles ?
    Par insane_80 dans le forum Schéma
    Réponses: 2
    Dernier message: 24/12/2014, 10h50
  2. Comment appliquer des propriétés à mes objets ?
    Par Alexino2 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 26/02/2007, 17h20
  3. comment reconnaitre le type d'objet
    Par reski dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 17/09/2006, 20h15
  4. [VB.Net] Comment comparer des types?
    Par smedini dans le forum VB.NET
    Réponses: 1
    Dernier message: 20/01/2006, 12h00
  5. Traitement d'image, comment distinguer des types?
    Par inai dans le forum Traitement du signal
    Réponses: 15
    Dernier message: 07/06/2005, 01h09

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