|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre du Club
![]() Inscription : novembre 2007 Messages : 115 ![]() |
Bonjour,
On est sur un service où on doit stocker les noms et tous les prénoms de nos clients. Nos développeurs fournissent ce genre de table ID (int) Nom (varchar 50) Prenom_1 (varchar 50) Prenom_2(varchar 50) Prenom_3(varchar 50) Prenom_4(varchar 50) Prenom_5(varchar 50) En sachant qu'on a tous un prénom Je penserai plus vers une structure à 2 tables comme ça: Client ID (INT) Nom (varchar 50) Prenom (varchar 50) Client_prénom ID (int) Prénom (varchar 50) Ordre (varchar 50) Selon vous, quelle serait la meilleure solution ? Merci. ps: on tourne sur MSSQL 2008 R2 |
|
|
10
|
|
|
#2 |
![]() ![]() |
Effectivement, la seconde structure est meilleure. Et quitte à séparer les prénoms, autant séparer aussi le premier prénom !
Surtout que tes clients ne sont (ou ne seront) peut-être pas tous des personnes physiques avec prénom mais aussi des personnes morales sans prénom ! Au fait, ça existe des prénoms de 50 caractères ? Un VARCHAR(30) ne serait-il pas suffisant ? Quant à l'ordre, un TINYINT serait plus approprié !
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur. 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 la suite Linux Mageïa ! |
|
10
|
|
|
#3 | |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 12 099 ![]() |
Citation:
En effet vous aurez de la redondance ! la solution je l'ai donné dans le modèle ici : http://blog.developpez.com/exercices...-de-personnes/ A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
|
|
10
|
|
|
#4 |
|
Membre du Club
![]() Inscription : novembre 2007 Messages : 115 ![]() |
Bonjour,
Merci pour votre réponse. En effet, du tinyint est plus approprié pour l'ordre, petite erreur de clavier ![]() Sinon cette table ne s’occupera que de personne physique, et que le 1er prénom sera souvent affiché. Et merci pour le lien, je lirai en cours de journée, car bien que cela me sera utile, et que j'en suis reconnaissant, mais ce qui y est décrit dépasse « un peu » mes besoins. Si on parle du coté logique de la chose j’opterai directement pour une table à part, mais entre les best practice et ce qui est optimal il y a souvent une marge en READ et WRITE. Sinon qu’elle serait selon vous de bon argument pour favorisé la table ‘prénom’ + Normalisation Espace gagné … - Un chouia plus compliqué pour les inserts Prise de tête avec les développeurs pour leur faire changer d’avis (^^) … Encore merci pour votre temps |
|
|
10
|
|
|
#5 |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 12 099 ![]() |
Il n'y a que des avantages et aucun inconvénient à utiliser ce modèle, tant sur le plan de la facilité de requêtage que sur les performances.
mais pour le comprendre, il faut implémenter le MED (Modèle Externe de Données) c'est à dire les vues, ce qu'hélas peu de développeurs font. A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
|
10
|
|
|
#6 | |
![]() ![]() |
Tout comme il y a le Modèle Organisationnel des Traitements (MOT), ne dit-on pas plutôt Modèle Organisationnel des Données (MOD) en méthode Merise ?
Et pendant que j'y suis : Citation:
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur. 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 la suite Linux Mageïa ! |
|
|
10
|
|
|
#7 | |||||
|
Membre du Club
![]() Inscription : novembre 2007 Messages : 115 ![]() |
Citation:
Maintenant autre question bête. Pour faire un select (ou crée là vue) je ferai : Code :
ou je créerai une requete du genre Code :
|
|||||
|
|
10
|
|
|
#8 |
![]() ![]() |
Tu crées une vue avec la première requête. Enfin mieux adaptée à ton cas réel.
La présentation des données avec un prénom par colonne ou à la suite séparés par des virgules est du ressort de l'application donc du développeur.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur. 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 la suite Linux Mageïa ! |
|
10
|
|
|
#9 |
|
Membre du Club
![]() Inscription : novembre 2007 Messages : 115 ![]() |
Mais dans le cas on la query retourne + de 10 collones
on aurait quelque chose comme Dupont[]Marc[/][]Col1[/][]col2[/]... Dupont[]Mika[/][]Col1[/][]col2[/]... Dupont[]Luc[/][]Col1[/][]col2[/]... Dupont[]Pierre[/][]Col1[/][]col2[/]... Est ce vraiment plus performant ?, Désolé d'être aussi pointilleux Et encore un grand merci
|
|
|
10
|
|
|
#10 |
![]() ![]() |
Pas 10 colonnes mais 10 lignes si la personne a 10 prénoms et seulement 3 lignes si la personne n'a que 3 prénoms.
Et pour un programmeur digne de ce nom, c'est un processus très classique de parcourir un jeu de résultat et de gérer la rupture sur le nom afin de rassembler tous les prénoms d'un nom.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur. 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 la suite Linux Mageïa ! |
|
10
|
|
|
#11 | |
|
Membre du Club
![]() Inscription : novembre 2007 Messages : 115 ![]() |
Citation:
Dans mon cas ici, la table a actuellement 28 colonnes (je reviendrais sur ce problème dans un autre post ^^). Donc en cas de multiple prénom ce qui m'inquiète ce ne sont pas les qualités du programmeur, car comme tu le souligne cela devrait être facile à gérer pour lui, mais plutôt les ressources utilisé. Disons que chaque ligne fera +- 500 octets, dans le cas 4 prénoms (c’est mon cas ), est ce qu’il fera un read de 2000 octets ? Mais il y a aura bien un envoi de 2000 octets via le réseau.Ce processe sera souvent utilisé donc potentiellement gourmant en ressource. Encore Merci
|
|
|
|
10
|
|
|
#12 | |
![]() ![]() |
Mais est-il nécessaire de ramener les 28 colonnes à chaque fois qu'on a besoin de tous les prénoms du client ?
Dans les requêtes, il faut éviter la guerre des étoiles ! Citation:
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur. 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 la suite Linux Mageïa ! |
|
|
10
|
|
|
#13 | ||
|
Membre du Club
![]() Inscription : novembre 2007 Messages : 115 ![]() |
Bonjour,
Merci pour l'intérêt que tu portes à mon post ^^. Cela sera très loin d'un select *, mais l'interface aura besoin de au moins 15 de ces champs, cela restera de la déduplication de donné pour les 14 autres colonnes. Ma question est : Est-ce que cela est il préférable à ceci : Code :
Merci |
||
|
|
00
|
|
|
#14 |
![]() ![]() |
La jointure et le traitement d'affichage des données par le programme sera probablement plus rapide que les requêtes SELECT ; ça fait toujours pusieurs requêtes à exécuter par le SGBD plutôt qu'une seule !
Quel volume de données (combien de lignes de résultat de la requête) sera à traiter par le programme ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur. 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 la suite Linux Mageïa ! |
|
00
|
|
|
#15 |
|
Membre du Club
![]() Inscription : novembre 2007 Messages : 115 ![]() |
+- 300 000 rows (+-300 octects chaque ligne)
|
|
|
00
|
|
|
#16 |
![]() ![]() |
Pour quel besoin le programme devrait-il traiter autant de noms en même temps ?
J'imagine qu'il ne s'agit pas d'afficher d'un coup les 300 000 lignes ? 300 000 lignes c'est tout petit pour un SGBD mais ça commence à être sensible pour un programme. Tout dépend du traitement qui est fait par ce programme sur le jeu de données.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur. 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 la suite Linux Mageïa ! |
|
00
|
|
|
#17 | ||
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 12 099 ![]() |
Dans le cadre de la solution que je vous ais déjà donné :
http://blog.developpez.com/exercices...-de-personnes/ Nous avons implémenté une vue avec les données de la personne et deux colonnes calculées par une même UDF : PRENOM_USUEL AUTRES_PRENOM La première contient le prénom usuel et s'il est composé le recompose. La seconde contient la liste de toutes les autres prénoms, séparé par des virgules et pour les prénoms composés, par un tiret. Voici le code de l'UDF (SQL Server) qui fait cela : Code :
http://blog.developpez.com/sqlpro/p7...sure-multiple/ A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
||
|
00
|
|
|
#18 |
|
Membre du Club
![]() Inscription : novembre 2007 Messages : 115 ![]() |
Bonjour,
Merci pour vos réponses. |
|
|
00
|
Copyright © 2000-2013 - www.developpez.com