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

Décisions SGBD Discussion :

Formes Normales et valeurs NULL


Sujet :

Décisions SGBD

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    vh
    vh est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 24
    Par défaut Formes Normales et valeurs NULL
    Bonjour,

    À la fin de mes études d'informatiques, l'entrée dans la vie professionnelle m'a vite faite comprendre que la théorie des formes normalles étaient souvent sabotées par les obligations de gain de temps de développement. J'ai donc fini par oublier le vocabulaire des formes normalles et créer mes tables plus par expérience qu'avec l'aide de la théorie.

    Maintenant, j'aimerai bien m'y remettre donc j'ai déjà lu Dénormalisation de table. Quand ? et entre la theorie et la pratique! mais j'ai encore des zones obscures dans la conception des tables.
    J'ai par exemple cette table Client ("id_client" est une clé primaire et "type_contrat" une clé étrangère)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    id_client  |  nom_client  |  type_contrat  |  offre_du_moment  
    -----------+--------------+----------------+-------------------------
    1          |  Bouchard    |  A             |  NULL         
    2          |  Jean        |  A             |  NULL         
    3          |  Rodriguez   |  A             |  NULL         
    4          |  La Fleur    |  B             |  Un bouquet acheté pour deux gratuits
    5          |  Nestor      |  A             |  NULL
    Les clients qui ont un payé un contrat "B" peuvent ajouter un texte personalisé. La proportion est d'environ 1 contrat "B" pour 10 contrats "A" donc je me retrouve avec des tonnes de valeurs "NULL".
    À partir de là, je me demande si en suivant la théorie des Formes Normales, j'aurais pu découper ma table dès le début ?

    Ou alors il s'agit uniquement d'optimisation et donc ça se rapporte à la question "Quand dénormaliser ?" qui a pour réponse "Après avoir analysé le système en production" ?

  2. #2
    Expert éminent
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 202
    Billets dans le blog
    16
    Par défaut
    Bonjour VH,

    La théorie de la normalisation fait partie du Modèle Relationnel de Données alors que les valeurs nulles en sont bannies. Pour être en conformité (et en prime procéder à un dégraissage sérieux), il suffit de casser la table Client en deux (comme lorsqu’on normalise) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Create Table Client
    (   Id_Client     Int        Not Null,
        Nom_Client    Char (xx)  Not Null,
        Type_Contrat  Char (xx)  Not Null,
      Primary key (Id_Client),
      Foreign key (Type_Contrat)...
    ) ;
    Create Table Client_Offre_Du_Moment
    (   Id_Client     Int           Not Null,
        Offre_Du_Moment  Char (xx)  Not Null,
      Primary key (Id_Client),
      Foreign key (Id_Client) References Client On Delete Cascade 
    )
    Toutes les colonnes sont maintenant NOT NULL.

    Concernant la contrainte qui veut que seuls les clients ayant un contrat de type B puissent figurer dans la table Offre_Du_Moment, du point de vue du standard (ou norme) SQL, vous pouvez coder quelque chose de ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Create Assertion Contrainte_xx 
        Check (Not Exists 
                (Select * 
                 From Client A 
                 Where Type_Contrat <> 'B'
                    And Exists 
                       (Select * 
                        From Offre_Du_Moment B
                        Where A.Id_Client = B.Id_Client)
                       )
                )
              ) ;
    Dans la mesure où votre SGBD ne propose pas l’instruction Create Assertion, vous pouvez utiliser un trigger.

    Pour vous rafraîchir la mémoire quant à la normalisation des tables, vous pouvez lire la discussion :

    http://www.developpez.net/forums/sho...d.php?t=281221
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  3. #3
    vh
    vh est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 24
    Par défaut
    Citation Envoyé par fsmrel
    La théorie de la normalisation fait partie du Modèle Relationnel de Données alors que les valeurs nulles en sont bannies.
    d'accord merci pour ta réponse
    donc j'aurais pu le prévoir dès le début

    Citation Envoyé par fsmrel
    Dans la mesure où votre SGBD ne propose pas l’instruction Create Assertion, vous pouvez utiliser un trigger.
    étant développeur Web j'ai surtout de l'expérience avec MySQL qui ne permet pas de faire grand chose puisque les dernière versions (avec triggers, procédures stockées) ne sont pas encore disponibles chez tous les hébergeurs mutualisés.
    de plus j'ai tendance à gérer ce genre de contrainte dans mon code et comme ça je limite l'utilisation du SGBDR au simple stockage des données. Je pense que ça m'aide aussi à construire des tables correctes puisqu'il ne faut pas qu'on puisse remplir les tables avec des données qui ne sont pas cohérentes entre elles

    par contre en partant de ce principe, je mets systématiquement les champs en "NULL acceptés" puisque dans ma logique c'est à mon code de gérer l'insertion de valeurs correctes donc je vais revoir ce point

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 998
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 998
    Billets dans le blog
    6
    Par défaut
    vh
    ... votre titre : "Formes Normales et valeurs NULL" est une hérésie au bon sens : NULL n'est pas une valeur, c'est un marqueur qui représente justement l'absence de valeur comme nil en programmtion à base de pointeurs...

    fmsrel
    ... plus simple l'assertion :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE Assertion Contrainte_xx 
    CHECK NOT EXISTS (SELECT * 
                      FROM   Client C
                             INNER JOIN Offre_Du_Moment O
                                   ON C.Id_Client = O.Id_Client
                      WHERE  Type_Contrat <> 'B')
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    vh
    vh est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 24
    Par défaut
    Citation Envoyé par SQLpro
    ... votre titre : "Formes Normales et valeurs NULL" est une hérésie au bon sens : NULL n'est pas une valeur, c'est un marqueur qui représente justement l'absence de valeur comme nil en programmtion à base de pointeurs...
    ok
    ce que j'ai prévu de faire c'est de concevoir mes prochaines tables avec uniquement des champs "NOT NULL"

    merci à vous tous pour vos explications

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 998
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 998
    Billets dans le blog
    6
    Par défaut
    ce que j'ai prévu de faire c'est de concevoir mes prochaines tables avec uniquement des champs "NOT NULL"
    C'est la pire des choses à faire...

    Petite anecdote... Un jour j'audite une application dans laquelle les développeurs avient tout mis en NOT NULL. Il s'agissait d'un site web de vente de lingerie fine.... Or la date de naissance des clients étaient rarement renseigné et comme c'était du NOT NULL ils mettaient par défaut 01/01/1900.

    Quand on a voulu faire des statistiques de vente on s'est aperçut que la moyenne d'âge des clients qui achetaient des strings avec dentelles était de 84 ans. Je leur ait alors dit de se reconvertir dans le DAMART !!!

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

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

Discussions similaires

  1. [AC-2010] Tester la valeur Null dans la mise en forme conditionnelle
    Par Sefrou dans le forum IHM
    Réponses: 0
    Dernier message: 21/05/2011, 20h04
  2. 'form' a la valeur null ou n'est pas un objet.
    Par ruza01 dans le forum Général JavaScript
    Réponses: 29
    Dernier message: 22/01/2009, 11h54
  3. Réponses: 9
    Dernier message: 14/01/2009, 16h01
  4. Erreur sous IE : 'form' a la valeur Null ou n'est pas un objet
    Par Esil2008 dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 30/04/2008, 16h39
  5. [Servlet] pb multipart/form-data retourne valeur null
    Par Doumeasse38 dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 12/05/2006, 08h46

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