Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Administration
Administration Forum d'entraide sur l'administration du dataserver, via SSM ou ligne de commande, les tables système, ...
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 15/04/2011, 16h25   #1
Membre du Club
 
Inscription : novembre 2007
Messages : 112
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : novembre 2007
Messages : 112
Points : 57
Points : 57
Par défaut Multiple varchar(50) contre 1 varchar (200)

Bonjour,
Tout est dans le titre mais je vais appronfondire ma question
Sur une table Client qui peut potentiellement avoir jusque 4 prénom.

Qu'est ce qui est mieux

Prenom1 varchar (50)
Prenom2 varchar (50)
Prenom3 varchar (50)
Prenom4 varchar (50)

ou

Prenom varchar (250) avec un charactere special entre chaque prenom (|,#,..).


Perso je pencherai vers la seconde solution, mais je souhaiterai l'avis d'expert.

Merci.
mikaeru est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/04/2011, 16h42   #2
Responsable SQL Server

 
Avatar de mikedavem
 
Homme David BARBARIN
Expert SQL Server
Inscription : août 2005
Messages : 3 723
Détails du profil
Informations personnelles :
Nom : Homme David BARBARIN
Localisation : France, Haute Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Expert SQL Server
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 723
Points : 6 844
Points : 6 844
Tout dépend comment vous considérez cette information mais la première solution me parait de loin être la meilleure pour les deux raisons suivantes :

- Permet de faire des recherches rapides et de bénéficier éventuellement d'index.
- Si vous avez beaucoup d'absences de valeurs (un client a rarement 4 prénoms) vous pourez toujours bénéficier des optimisations de stockage proposés par SQL Server (compression, colonnes sparses).

++
mikedavem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/04/2011, 09h21   #3
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

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

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
J'abonde... sans compter les efforts que cela vous épargnera pour parser votre colonne prénoms afin d'extraire les différents prénoms...
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/04/2011, 08h12   #4
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 953
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 953
Points : 17 773
Points : 17 773
Ni l'un, ni l'autre...
En sus rien n'interdit d'avoir 5 prénoms !

La seule bonne solution est de créer une table fille avec les prénoms et la position de chacun des prénoms.
Exemple :
Code :
1
2
3
4
5
6
7
8
CREATE TABLE T_PRENOM_PERSONNE_PNP
(PNP_ID           INT NOT NULL PRIMARY KEY,
 PRS_ID           INT NOT NULL REFERENCES T_PERSONNE_PRS (PRS_ID),
 PNP_POSITION TINYINT NOT NULL,
 PNP_PRENOM   VARCHAR(32) NOT NULL,
CONSTRAINT    UK_PNP_PRS_POS UNIQUE (PRS_ID, PNP_POSITION),
CONSTRAINT    UK_PNP_PRS_PRN UNIQUE (PRS_ID, PNP_PRENOM)
);
La position, comme le prénom étant unique pour chaque personne.

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 * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 18/04/2011, 09h43   #5
Membre du Club
 
Inscription : novembre 2007
Messages : 112
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : novembre 2007
Messages : 112
Points : 57
Points : 57
Bonjour,

J'avoue que j'ai une préférence pour la dernière solution.

Faut juste que j’appuie cette solution au DEV.

Une autre question , dans le cas d’une table « Prénom ».

On va prendre mon cas, j’ai 4 prénoms, donc si on devait m’enregistrer il y aurai 5 insert.

Donc l’application devrait avoir 5 connections(donc ouvrir 5 session) vers le SQL server, ou il est possible d’envoyer les 5 insert en une session ?

Dsl, si cette question dépasse un peu le domaine SQL pure.


Merci encore.
mikaeru est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/04/2011, 10h53   #6
Responsable SQL Server

 
Avatar de mikedavem
 
Homme David BARBARIN
Expert SQL Server
Inscription : août 2005
Messages : 3 723
Détails du profil
Informations personnelles :
Nom : Homme David BARBARIN
Localisation : France, Haute Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Expert SQL Server
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 723
Points : 6 844
Points : 6 844
Autant pour moi la solution de SQLPro est de loin la meilleure ... après y avoir réfléchi juste un peu

++
mikedavem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/04/2011, 11h07   #7
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

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

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Pareil...
Oui on ne va pas reparler de première forme normale
La dernière fois cela s'est terminé en débat interminable (mais au combien intéressant) avec fsmrel:
http://www.developpez.net/forums/d36...08-nouveautes/
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/04/2011, 13h22   #8
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 667
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 667
Points : 8 715
Points : 8 715
Hé les gars, faut penser à vous reposer
J'ai pensé à une solution proche de celle proposée par SQLPro dès la lecture du premier post !

@++
__________________
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 18/04/2011, 14h03   #9
Membre du Club
 
Inscription : novembre 2007
Messages : 112
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : novembre 2007
Messages : 112
Points : 57
Points : 57
Salut,
J'y avais pensé aussi, si si
Mais pour une obscure raison, je me suis laissé entrainé par les besoin des devlopeurs en pensant à leur facilité, mais cela était mon erreur

Merci encore de m'avoir ouvert les yeux (on croirais presque à un rite religieux ^^)

Merci pour le lien, Encore de la lecture ^^
mikaeru est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/04/2011, 14h05   #10
Membre du Club
 
Inscription : novembre 2007
Messages : 112
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : novembre 2007
Messages : 112
Points : 57
Points : 57
Une idée pour ma question ? ^^, merci d'avance.

Citation:
Envoyé par mikaeru Voir le message
Bonjour,

Une autre question , dans le cas d’une table « Prénom ».

On va prendre mon cas, j’ai 4 prénoms, donc si on devait m’enregistrer il y aurai 5 insert.

Donc l’application devrait avoir 5 connections(donc ouvrir 5 session) vers le SQL server, ou il est possible d’envoyer les 5 insert en une session ?

Dsl, si cette question dépasse un peu le domaine SQL pure.


Merci encore.
mikaeru est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/04/2011, 15h03   #11
Responsable SQL Server

 
Avatar de mikedavem
 
Homme David BARBARIN
Expert SQL Server
Inscription : août 2005
Messages : 3 723
Détails du profil
Informations personnelles :
Nom : Homme David BARBARIN
Localisation : France, Haute Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Expert SQL Server
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 723
Points : 6 844
Points : 6 844
Vous pouvez insérer vos 4 prénoms dans une seule session SQL Server depuis votre application.

Une session peut très bien avoir plusieurs requêtes SQL actives.

@Elsuket > Je crois oui ou il faudrait que je réponde à tête reposée quand je ne suis pas en train de gérer un autre problème :-)

++
mikedavem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/04/2011, 15h07   #12
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

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

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Citation:
Une autre question , dans le cas d’une table « Prénom ».

On va prendre mon cas, j’ai 4 prénoms, donc si on devait m’enregistrer il y aurai 5 insert.

Donc l’application devrait avoir 5 connections(donc ouvrir 5 session) vers le SQL server, ou il est possible d’envoyer les 5 insert en une session ?

Dsl, si cette question dépasse un peu le domaine SQL pure.


Merci encore.
Quelle est votre version de SQL SERVER?
Depuis la 2008 cette syntaxe fonctionne (à générer dans votre code ADO par exemple avec des SqlParameters bien entendu pour éviter des attaques SQL comme sur mysql.com...):

Code :
INSERT INTO TABLE(col1,col2...) VALUES (valcCol1,ValPrenom1),(valCol1,ValPrenom2),(valCol1,ValPrenom3)
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/04/2011, 09h43   #13
Membre du Club
 
Inscription : novembre 2007
Messages : 112
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : novembre 2007
Messages : 112
Points : 57
Points : 57
Citation:
Envoyé par iberserk Voir le message
Quelle est votre version de SQL SERVER?
Depuis la 2008 cette syntaxe fonctionne (à générer dans votre code ADO par exemple avec des SqlParameters bien entendu pour éviter des attaques SQL comme sur mysql.com...):

Code :
INSERT INTO TABLE(col1,col2...) VALUES (valcCol1,ValPrenom1),(valCol1,ValPrenom2),(valCol1,ValPrenom3)
Bonjour,
Interessant, Quel sont ces parametres? (oui on utilise 2008 R2) ?
Mais si je veux faire;
insert into Client (...) Value (...)
&
insert into client_prenom (...) Value (...)(...)(...)(...)
L'appli devra ouvrir au moins 2 connections?
mikaeru est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/04/2011, 10h03   #14
Responsable SQL Server

 
Avatar de mikedavem
 
Homme David BARBARIN
Expert SQL Server
Inscription : août 2005
Messages : 3 723
Détails du profil
Informations personnelles :
Nom : Homme David BARBARIN
Localisation : France, Haute Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Expert SQL Server
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 723
Points : 6 844
Points : 6 844
Non si vous exécutez ces requêtes dans une même session.

++
mikedavem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/04/2011, 12h07   #15
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

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

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Citation:
L'appli devra ouvrir au moins 2 connections?

Ça dépend de vous... qu'utilisez vous pour accéder à votre base de données?
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/04/2011, 12h37   #16
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 953
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 953
Points : 17 773
Points : 17 773
Ou mieux en utilisant une vue et un triigger INSTAED OF INSERT....

Démonstration

Code :
1
2
3
4
5
6
7
CREATE VIEW V_PERSONNE_PRENOM
AS
SELECT PRS.*, PNP_ID, PNP_POSITION, PNP_PRENOM
FROM   T_PERSONNE AS PRS
       INNER JOIN T_PRENOM_PERSONNE_PNP AS PNP
             ON PRS.PRS_ID = PNP.PRS_ID
GO
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE TRIGGER E_I_PERSONNE_PRENOM
ON  V_PERSONNE_PRENOM
INSTEAD OF INSERT
AS
 
INSERT INTO T_PERSONNE
SELECT PRS_NOM
FROM   inserted;
 
INSERT INTO T_PRENOM_PERSONNE_PNP
SELECT PRS_ID, PNP_POSITION, PNP_PRENOM
FROM   inserted;
GO
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 * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2011, 16h03   #17
Membre du Club
 
Inscription : novembre 2007
Messages : 112
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : novembre 2007
Messages : 112
Points : 57
Points : 57
Bonjour,
Encore une petite question, est ce que SQL 2008 a une fonction d'agregat pour concat du varchar,

l'idée serait de remplacer

1 Dupont Michael
1 Dupont Marc
1 Dupont Laurent

par :
1 Dupont Michael, Marc, Laurent.

Histoire déviter de créer une fonction pour le faire.
mikaeru est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2011, 16h32   #18
Membre du Club
 
Inscription : novembre 2007
Messages : 112
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : novembre 2007
Messages : 112
Points : 57
Points : 57
Re bonjour,
en proposant l'idée de la table prenom, je suis venu avec les arguments suivant :

• Normalisation,
• gain d’espace disque,
• donc moins de fragmentation
• lors des requêtes faire un « where » sur une seul colonne et non sur les 4 prénoms potentiel

Est ce que vous voyez d'autre argument que j'aurais manqué?

Merci pour votre temps
mikaeru est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/04/2011, 08h26   #19
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

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

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Citation:
Bonjour,
Encore une petite question, est ce que SQL 2008 a une fonction d'agregat pour concat du varchar,

l'idée serait de remplacer

1 Dupont Michael
1 Dupont Marc
1 Dupont Laurent

par :
1 Dupont Michael, Marc, Laurent.

Histoire déviter de créer une fonction pour le faire.
Cette tache ne doit pas être confiée à votre SGBDR... il n'est pas là pour çà, faite cela dans votre code client.
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/04/2011, 10h32   #20
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 953
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 953
Points : 17 773
Points : 17 773
Citation:
Envoyé par mikaeru Voir le message
Re bonjour,
en proposant l'idée de la table prenom, je suis venu avec les arguments suivant :

• Normalisation,
• gain d’espace disque,
• donc moins de fragmentation
• lors des requêtes faire un « where » sur une seul colonne et non sur les 4 prénoms potentiel

Est ce que vous voyez d'autre argument que j'aurais manqué?

Merci pour votre temps
Meilleurs performances (incomparables) pour le recherche. Dans la solution en plusieurs colonnes comme en une seule avec tout mélangé, aucun index ne peut être utilisé.
Dans la solution avec table externe, un index peut être systématiquement utilisé si on le pose sur l'unique colonne prenom.

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 * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h18.


 
 
 
 
Partenaires

Hébergement Web