Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server
MS SQL-Server Forum Microsoft SQL-Server. Avant de poster -> FAQ SQL-Server, Tutoriels SQL-Server
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 19/09/2011, 16h01   #1
Invité de passage
 
Homme
Inscription : septembre 2011
Messages : 5
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Seine Saint Denis (Île de France)

Informations professionnelles :
Secteur : Bâtiment Travaux Publics

Informations forums :
Inscription : septembre 2011
Messages : 5
Points : 1
Points : 1
Par défaut besoin de conseil pour une conception Bdd

Bonjour,
je vous expose rapidement ma problématique, j'ai conçu une Bdd d'une application client / serveur pour un bureau d'étude. Cette application permet tout simplement de réaliser des prestations sur des équipements (différents type d'audit). un audit est une série de questions auquel l'auditeur réalise des mesures ou répond aux questions en sélectionnant une réponse dans une liste.
Vous trouverez ci-joint le schéma de ma Bdd.

une autre précision : l'application permet de créer la volée des nouveaux types de prestations, de nouvelles questions, ETc tout est paramétrable...
un audit comporte en moyenne 230 questions. toutes les réponses sont stockées dans la table Valoriser ==> elle est énorme aujourd'hui (presque un million de lignes)

Ma problématique : nous souhaitons ajouter un nouveau type de prestations qui garde la même logique mais avec un traitement un peu différent et bien sur le but final est toujours garder les relations entre différentes prestations effectuées sur un seul équipement ==> garder la dernière mesure connue.

pour répondre à cette problématique : un collègue propose de dupliquer toutes les tables (copier/coller des tables existantes pour séparer les deux prestations).
je ne suis pas d'accord avec sa proposition pour la simple raison que c'est complètement inutile et ça ajoute du travail pour rien. à la limite dupliquer la table Valoriser (table qui évolue a raison de 230 ligne a chaque nouvelle prestations), je veux bien mais les autres ça n'a aucun intérêt a part créer des tables en doubles dans la Bdd ??

Je pars du principe de factoriser des Bdd et non les dupliquer.

quelle solution pensez vous est plus intéressante ?
Merci de vos réponses
Images attachées
Type de fichier : gif Diagramme Audit.gif (63,9 Ko, 14 affichages)
brouis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2011, 18h29   #2
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 669
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

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

Informations forums :
Inscription : janvier 2005
Messages : 4 669
Points : 8 729
Points : 8 729
Bonjour,

Votre approche est de toute façon la meilleure : en bases de données relationnelles SQL, on ne duplique pas, ou alors la conception a été mal faite.
Or, au vu de votre modèle physique, ça m'a plutôt l'air réfléchi.

Citation:
Ma problématique : nous souhaitons ajouter un nouveau type de prestations qui garde la même logique mais avec un traitement un peu différent et bien sur le but final est toujours garder les relations entre différentes prestations effectuées sur un seul équipement ==> garder la dernière mesure connue.
Dommage que vous n'ayez pas donné plus de détails, aussi il est probable que cela ne vous soit pas possible.
Rien n'empêche l'ajout de nouvelles tables pour supporter le nouveau type de prestation.

Il serait donc judicieux d'ajouter un type de prestations, étant donné que si vous partez sur deux types de prestations, il est fort probable que dans le futur la base de données doive en supporter bien plus.
De là vous ajoutez une colonne dans la table prestation, qui indique le type de la prestation.

Vous pouvez aussi procéder par héritage, c'est à dire :
- une entité comprenant tous les attributs communs à toute prestation
- chaque prestation s'exclut de toutes les autres, référence l'entité mère décrite ci-dessus, et ne contient que les attributs qui lui sont spécifiques.

Par exemple, un entité mère prestation, et des entité filles "audit", QCM, sur site, ...

Malheureusement sans plus de détails, difficile d'aller plus avant

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2011, 16h57   #3
Invité de passage
 
Homme
Inscription : septembre 2011
Messages : 5
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Seine Saint Denis (Île de France)

Informations professionnelles :
Secteur : Bâtiment Travaux Publics

Informations forums :
Inscription : septembre 2011
Messages : 5
Points : 1
Points : 1
Citation:
Envoyé par elsuket Voir le message
Bonjour,

Il serait donc judicieux d'ajouter un type de prestations, étant donné que si vous partez sur deux types de prestations, il est fort probable que dans le futur la base de données doive en supporter bien plus.
De là vous ajoutez une colonne dans la table prestation, qui indique le type de la prestation.

@++
ma table prestation contient toutes les informations administratives de la prestation : date de saisie, adresse, IdEquipement, IdClient, IdAuditeur,Etat, Type prestation.

Selon le type de la prestation je charge la liste des champs (questions) affecté à un audit.

jusqu’à la mon modèle de Bdd peut supporter n type de prestations ainsi que n champs de saisie.

la faille de mon modèle de données ( à mon avis) réside dans la table valoriser qui se remplit trop vite.

Ma problématique est que la deuxième personne qui bosse avec moi sur le même projet ne résous pas vraiment le problème vu qu'il a dupliquer mon modèle pour un nouveau type de prestation ==> donc un jour ou l'autre la table valoriser de la nouveau type de prestation arrivera à son tour à devenir énorme et se retrouvera confronté à la même problématique.
brouis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2011, 17h47   #4
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 669
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

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

Informations forums :
Inscription : janvier 2005
Messages : 4 669
Points : 8 729
Points : 8 729
Citation:
la faille de mon modèle de données ( à mon avis) réside dans la table valoriser qui se remplit trop vite.
C'est-à-dire ? Combien de lignes enregistrez-vous par jour ?
Ou quand vous modifiez (entendez par là INSERT + UPDATE + DELETE) la table, combien de lignes affectez-vous ?
Vous pouvez envisager le partitionnement ...
Quel est le mode de restauration de votre base de données ?

Citation:
Ma problématique est que la deuxième personne qui bosse avec moi sur le même projet ne résous pas vraiment le problème vu qu'il a dupliquer mon modèle pour un nouveau type de prestation ==> donc un jour ou l'autre la table valoriser de la nouveau type de prestation arrivera à son tour à devenir énorme et se retrouvera confronté à la même problématique.
Effectivement c'est totalement absurde.
Je vous suggère vivement d'avoir une discussion là-dessus avec lui/elle.
Si cela ne suffit pas, et en supposant que votre supérieur sache ce que signifie bases de données relationnelle SQL, ce qui, entre nous, est rarement le cas, voyez avec eux.

Dans ces cas-là, moi quand j'en ai assez, je donne ma démission ...

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2011, 18h05   #5
Invité de passage
 
Homme
Inscription : septembre 2011
Messages : 5
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Seine Saint Denis (Île de France)

Informations professionnelles :
Secteur : Bâtiment Travaux Publics

Informations forums :
Inscription : septembre 2011
Messages : 5
Points : 1
Points : 1
Citation:
Envoyé par elsuket Voir le message
C'est-à-dire ? Combien de lignes enregistrez-vous par jour ?
Ou quand vous modifiez (entendez par là INSERT + UPDATE + DELETE) la table, combien de lignes affectez-vous ?
Vous pouvez envisager le partitionnement ...
Quel est le mode de restauration de votre base de données ?

@++
alors nous avons 40 consultants qui saisissent en moyenne 4 audit par jour et par personne donc (230 lignes * 40 * 4 ) par jour.
mode d'insertion :
une ligne dans la table Prestations et 230 lignes dans la table Valoriser.
les requêtes sont uniquement des INSERT parce que même en mode modification : on supprime et on réinsère.
notre Bdd est totalement hébergé et on s'occupe pas de la restauration. je sais qu'elle est mode cluster mais le reste je ne l'ai jamais géré
Merci de votre aide
brouis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2011, 19h30   #6
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 669
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

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

Informations forums :
Inscription : janvier 2005
Messages : 4 669
Points : 8 729
Points : 8 729
Bon alors ça fait 36.800 lignes par jour, rien de bien méchant.
Pensez simplement à bien indexer et éventuellement à partitionner par année, car cela fait 13 millions de lignes environ

En revanche, évitez à tout prix la duplication.

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2011, 21h32   #7
Invité de passage
 
Homme
Inscription : septembre 2011
Messages : 5
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Seine Saint Denis (Île de France)

Informations professionnelles :
Secteur : Bâtiment Travaux Publics

Informations forums :
Inscription : septembre 2011
Messages : 5
Points : 1
Points : 1
Citation:
Envoyé par elsuket Voir le message
Bon alors ça fait 36.800 lignes par jour, rien de bien méchant.
Pensez simplement à bien indexer et éventuellement à partitionner par année, car cela fait 13 millions de lignes environ

En revanche, évitez à tout prix la duplication.

@++
Merci pour le conseil ça me rassure.
En revanche, quand vous dites "partitionner par année" : je n'ai aucune idée comment je pourrais gérer ça . est ce que je pourrais faire une table Valoriser2010, une table Valoriser2011 et ainsi de suite ?
Après si dois chercher sur toute la Bdd, j'utilise les union ?

Ensuite, concernant les index, normalement, la table est indexé. j'ai ajouté une capture d'écran.

Merci encore
Images attachées
Type de fichier : jpg CaptureEcran_01 Sep. 20 21.28.jpg (119,3 Ko, 3 affichages)
brouis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2011, 12h12   #8
Modérateur
 
Avatar de Jinroh77
 
Homme Alexandre Chemla
Consultant en Business Intelligence
Inscription : février 2006
Messages : 1 773
Détails du profil
Informations personnelles :
Nom : Homme Alexandre Chemla
Âge : 28
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence

Informations forums :
Inscription : février 2006
Messages : 1 773
Points : 1 837
Points : 1 837
le partitionnement consiste à découper une table techniquement sans en changer son aspect fonctionnel.
Vous aurez donc toujours 1 seule table "Valoriser" mais celle-ci sera découpée en plusieurs selon une fonction de partitionnement.
L'idée est alors de répartir ensuite les différentes parties sur des disques durs différents.
Un peu de lecture (SQL 2005).
__________________
Alexandre Chemla - Consultant MS BI chez Masao
Jinroh77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2011, 17h10   #9
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 669
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

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

Informations forums :
Inscription : janvier 2005
Messages : 4 669
Points : 8 729
Points : 8 729
La réponse de Jinroh77 est tout à fait exacte.

En ce qui concerne l'indexation, il semble que vous n'ayez que l'index de clé primaire.
En effet par défaut, lorsqu'on crée une clé primaire, un index cluster est créé sur la table.
Mais rien ne vous empêche d'ajouter des index non-cluster pour aider la recherche de lignes vérifiant les prédicats de jointure et de filtrage sur cette même table.

Veillez à ne pas mettre les colonnes qui participent à la clé de l'index cluster dans les index non-cluster : l'index non-cluster référence les lignes de l'index cluster (comme l'index à la fin d'un livre référence un numéro de page, qui est l'index cluster du livre : c'est l'ordre physique des pages).

Si vous en venez à partitionner, veillez à aligner vos index sur le schéma de partitionnement de la table.

Pour en savoir plus sur le partitionnement de tables, je vous invite à lire un peu ici et ici.

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 23/09/2011, 15h33   #10
Invité de passage
 
Homme
Inscription : septembre 2011
Messages : 5
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Seine Saint Denis (Île de France)

Informations professionnelles :
Secteur : Bâtiment Travaux Publics

Informations forums :
Inscription : septembre 2011
Messages : 5
Points : 1
Points : 1
Merci pour tout.
brouis 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 03h20.


 
 
 
 
Partenaires

Hébergement Web