Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 18/01/2012, 14h36   #1
Membre Expert
 
Avatar de Djakisback
 
Inscription : février 2005
Messages : 1 791
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 1 791
Points : 1 681
Points : 1 681
Par défaut Simplification de modèle relationnel et avis sur le type SET

Bonjour,
d'une manière générale, j'ai toujours essayé de respecter les formes normales et le principe de l'atomicité des données lors de la conception d'un modèle relationnel. Je me suis souvent retrouvé avec des modèles très complexes et les requêtes qui en découlent (et qui d'ailleurs au final peuvent poser de légers problèmes de consommation des ressources).

Je me demandais s'il existait des moyens (propres ou non au SGBD) pour simplifier tout cela. Si je prends un cas d'étude simple pour lequel un 'document' peut être lié à plusieurs 'types', ex. : un 'document' peut être de type 'Roman' et 'Poésie'

En général, j'ai tendance à procéder ainsi, avec 2 tables + 1 table de jointure :

Code :
1
2
3
4
5
6
7
8
document
d_id | d_titre
 
type
t_id | t_intitule
 
j_type
d_id | t_id
jeu de données qui donnerait :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
document
d_id | d_titre
1 | Le Val de Rose
 
type
t_id | t_intitule
1 | Roman
2 | Poésie
 
j_type
d_id | t_id
1 | 1
1 | 2
Tout d'abord, pensez-vous qu'il s'agit d'une bonne méthode dans le cas où la table 'type' n'est liée à aucune autre table et qu'en plus un enregistrement ne contient qu'un champ de donnée (i.e. ici l'intitulé) ? Y a-t-il une meilleure méthode ou plus communément utilisée ?

Je suis en train de réfléchir à l'utilisation du type SET qui pourrait peut-être répondre à ce type de besoin.

Auriez-vous des avis ou conseils sur l'utilisation du type SET ou sur d'autres techniques qui pourraient exister et simplifier les modèles et les requêtes dans ce même cas d'étude ? Sinon connaissez-vous des désavantages au type SET ? (ressources, recherches partielles/totales, souplesse, problèmes d'index ...)

En vous remerciant d'avance.
__________________
Vive les roues en pierre
Djakisback est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2012, 14h46   #2
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 686
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 686
Points : 10 435
Points : 10 435
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Je n'ai pas d'avis sur le type SET, mais ce que vous faites est bien la bonne méthode.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 18/01/2012, 15h01   #3
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 655
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 655
Points : 2 657
Points : 2 657
Bonjour,

Citation:
Tout d'abord, pensez-vous qu'il s'agit d'une bonne méthode dans le cas où la table 'type' n'est liée à aucune autre table et qu'en plus un enregistrement ne contient qu'un champ de donnée (i.e. ici l'intitulé) ? Y a-t-il une meilleure méthode ou plus communément utilisée ?
Oui, non, non.

Citation:
Je suis en train de réfléchir à l'utilisation du type SET qui pourrait peut-être répondre à ce type de besoin.

Auriez-vous des avis ou conseils sur l'utilisation du type SET ou sur d'autres techniques qui pourraient exister et simplifier les modèles et les requêtes dans ce même cas d'étude ? Sinon connaissez-vous des désavantages au type SET ? (ressources, recherches partielles/totales, souplesse, problèmes d'index ...)

Oui, pour moi c'est une très mauvaise idée.

Je ne comprend pas en quoi la requête est compliquée en fait ? Faire 1 ou 2 jointures de plus est si fatiguant que ca ?

Pour les désavantages que je vois (vu qu'on ne connait pas votre SGBD...) :
- Maintient horrible : obliger de faire un alter table pour ajouter / enlever une occurance du set
- Requête pas vraiment simplifiée vu qu'il faudra utiliser des fonctions spécifique au sgbd pour arriver à travailler avec les set
- Peut devenir source de contention / lock si forte activité autour de la table document ou affectation d'activité (plus qu'une table au lieu d'une table d'association)
- Est-ce les update / delete, sur votre SGBD seront aussi performant ? (c'est facile à tester)
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 18/01/2012, 16h25   #4
Membre Expert
 
Avatar de Djakisback
 
Inscription : février 2005
Messages : 1 791
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 1 791
Points : 1 681
Points : 1 681
Merci beaucoup pour vos réponses et conseils

A la base, je pensais à la solution du SET (ou autres) dans le but d'optimiser les exécutions de requêtes mais aussi leurs écritures. Il me semble que cela simplifierait pas mal le code étant donné qu'on peut beaucoup réduire le nombre de tables.
Comme dans certains modèles complexes, on peut parfois se retrouver avec plus d'une dizaine de jointures, je pense que ça pourrait réduire la complexité du code des requêtes mais aussi les ressources étant donné qu'on fait des SELECT sur moins de tables. (En fait, parfois ça n'est pas une ou deux jointures de moins que l'on aurait, il me semble que j'ai des modèles où cela en supprimerait bien 5 ou 6, mais peut-être que je suis trop gourmand sur ce que je veux récupérer en une seule fois)

Il est vrai que les ALTER TABLE pour un SET/ENUM ne m'ont jamais inspiré ; sur ce coup-là j'étais plutôt dans une optique de sélection des données (sur un modèle statique, si je puis dire) plutôt que d'insert/update/delete, car c'est plutôt sur des SELECT que je peux parfois rencontrer quelques problèmes de performance mais ça semble mauvais de penser un modèle uniquement pour un type de traitement. (Et il y a sans doute d'autres optimisations que je puisse faire dans des modèles/scripts avant de "bousiller" des modèles de données )

En fait, je croyais que SET et ENUM faisaient partie de la norme SQL et apparemment non, ce qui me dérange fortement. Je pense que je ferai des tests par curiosité mais je vais suivre les conseils et continuer dans la voie que j'ai suivie jusqu'ici. (Merci pour les désavantages proposés, 3 sur 4 auxquels je n'avais pas pensé)

Je me posais encore 2 petites questions, si l'on respecte la norme SQL, le principe des formes normales, et que l'on veut stocker des "titres/qualificatifs" de personnes (Monsieur, Madame, Abbé, etc.), on aura également 3 tables dont une d'association ?

Question un peu plus vague et sans doute un peu trop lié au SGBD mais cela vous arrive-t-il parfois de ne pas faire toutes les jointures nécessaires au jeu de données attendu en une seule requête mais, à partir de l'exemple extrêmement restreint présenté dans mon premier post, de récupérer tous les documents puis exécuter un nouveau SELECT pour chaque document afin de récupérer des données périphériques liées. Cela augmente considérablement le nombre de requêtes mais, dans mon souvenir, j'ai eu parfois de meilleurs performance dans certains cas. Auriez-vous des avis quelconques sur ce type de pratique ?
__________________
Vive les roues en pierre
Djakisback est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2012, 17h26   #5
Membre Expert
 
Inscription : août 2009
Messages : 779
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 779
Points : 1 098
Points : 1 098
Citation:
Envoyé par Djakisback Voir le message
Je me posais encore 2 petites questions, si l'on respecte la norme SQL, le principe des formes normales, et que l'on veut stocker des "titres/qualificatifs" de personnes (Monsieur, Madame, Abbé, etc.), on aura également 3 tables dont une d'association ?
Non, deux seulement, à moins que tu ne veuilles avoir des personnes pouvant avoir plusieurs titres.

Citation:
Question un peu plus vague et sans doute un peu trop lié au SGBD mais cela vous arrive-t-il parfois de ne pas faire toutes les jointures nécessaires au jeu de données attendu en une seule requête mais, à partir de l'exemple extrêmement restreint présenté dans mon premier post, de récupérer tous les documents puis exécuter un nouveau SELECT pour chaque document afin de récupérer des données périphériques liées. Cela augmente considérablement le nombre de requêtes mais, dans mon souvenir, j'ai eu parfois de meilleurs performance dans certains cas. Auriez-vous des avis quelconques sur ce type de pratique ?
Si cela arrive, c'est que le SGBD ne raisonne pas bien Probablement par manque d'infos au niveau des stats. Cela dit, unitairement (ie quand je passe des requêtes à la main), ça m'arrive assez souvent de le faire, mais c'est plus par flemme d'écrire une requête complète et pour avoir accès à des informations intermédiaires si les résultats ne me vont pas. Pour les requêtes "applicatives", j'essaie de réduire au maximum le nombre de requêtes.
Rei Ichido est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 18/01/2012, 17h45   #6
Membre Expert
 
Avatar de Djakisback
 
Inscription : février 2005
Messages : 1 791
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 1 791
Points : 1 681
Points : 1 681
Merci, il faudrait que je me forme un peu plus en administration de base de données pour mieux comprendre ces principes-là.

Citation:
Envoyé par Rei Ichido Voir le message
Non, deux seulement, à moins que tu ne veuilles avoir des personnes pouvant avoir plusieurs titres.
merci, effectivement. (En général j'utilise majoritairement le ENUM pour ces cas-là).
__________________
Vive les roues en pierre
Djakisback est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2012, 19h23   #7
Modérateur
 
Inscription : octobre 2008
Messages : 1 508
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 508
Points : 2 040
Points : 2 040
Citation:
Envoyé par Djakisback Voir le message
Je suis en train de réfléchir à l'utilisation du type SET qui pourrait peut-être répondre à ce type de besoin.

Auriez-vous des avis ou conseils sur l'utilisation du type SET ou sur d'autres techniques qui pourraient exister et simplifier les modèles et les requêtes dans ce même cas d'étude ?
Tout d'abord SET n'est pas un type répandu dans les SGBDs. Supposons qu'on parle en fait ici de mysql, dont la doc présente le type SET comme assimilable à un champ de 64 bits.
Ca, on peut toujours le faire dans tous les SGBDs avec un entier pour une taille fixe ou une chaine de caractères, ou même un champ binaire sans taille max.

Dans certains cas spécifiques ça peut effectivement être très performant. Par exemple pour associer jusqu'à 32 tags à des documents dans un champ de 32 bits, on peut savoir si tel document a les tags A et B et n'a pas les tags D ou E en lisant uniquement un champ entier dans la table document sans aucune jointure. Cette lecture est beaucoup plus performante qu'une multi-jointure sur une table (doc_id,tag_id) et le gain de place est également considérable.
estofilo est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 18/01/2012, 21h35   #8
Membre Expert
 
Avatar de Djakisback
 
Inscription : février 2005
Messages : 1 791
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 1 791
Points : 1 681
Points : 1 681
Effectivement, pour ce type d'opération, dans le sens gestion de flags si je comprends bien, ça semble intéressant. Apparemment, on doit pouvoir travailler aussi directement en binaire dessus. Merci pour cette précision, j'avais zappé ça dans la doc MySql
__________________
Vive les roues en pierre
Djakisback est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2012, 15h03   #9
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 331
Points : 18 331
Envoyer un message via MSN à CinePhil
Quelques bonnes pratiques...

1) Construire un modèle de données normalisé au maximum.

2) Utiliser des vues.
Ce sont elles qui vont éventuellement contenir des jointures multiples mais ensuite les requêtes applicatives sur les vues sont beaucoup plus simples.

3) Ne récupérer que les informations dont on a besoin.
Si vous voulez afficher une liste de documents avec juste le titre et l'auteur, inutile de récupérer sa version, sa date de création, de révision, le texte du résumé...
C'est ensuite lors du clic sur le titre du document qu'on aura besoin d'afficher d'autres informations.
Il ne faut pas multiplier les requêtes inutiles mais il faut faire les requêtes nécessaires.

4) Si vous avez un grand volume de données (à partir de plusieurs centaines de milliers de lignes dans certaines tables), prototypez la montée en charge sur les requêtes les plus gourmandes pour voir "si ça tient".
Identifiez les points chauds et commencez par tester la modification et/ou la création d'index.
Ensuite seulement, vous pourrez vous pencher sur la dénormalisation de certaines données, toujours en mesurant les résultats sur votre prototype.

Voir au sujet des index l'article de SQLPro.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 30
Vieux 20/01/2012, 10h38   #10
Membre Expert
 
Avatar de Djakisback
 
Inscription : février 2005
Messages : 1 791
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 1 791
Points : 1 681
Points : 1 681
Merci pour ces conseils supplémentaires.
Je pense être au point avec les points 1, 3 et la gestion des index mais n'ai jamais pratiquement utilisé les vues et ne connaît pas bien l'administration de BDD, il faudra que je m'y mette à l'occasion.
__________________
Vive les roues en pierre
Djakisback est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h43.


 
 
 
 
Partenaires

Hébergement Web