|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre habitué
![]() Inscription : novembre 2008 Messages : 238 ![]() |
Bonjour,
Je cherche à trier une vue sql par n° de commande. Ce n° est alphanumérique et s'écrit de la forme : ssaa-sequence. La longueur du n° de séquence n'est pas fixe. Je peux donc avoir 2011-99 et 2011-1012. Je souhaite avoir un tri décroissant de sorte que 2011-10001 se trouve avant 2011-9999. Je pense fixer un nombre de caractères maximum à 12. Je voudrai concaténer ssaa au n° de séquence complété à gauche par des zéro de manière à atteindre les 12 caractères et trier par cette concaténation. Je suis sur une bd Oracle. Julien. |
|
|
00
|
|
|
#2 |
![]() ![]() |
Quelle idée ! Pourquoi ne pas avoir deux colonnes, année et numéro de commande, et gérer l'affichage par une vue avec une simple concaténation ?
Si vous pouvez encore changer votre modèle, faites-le, vous ne respectez pas le principe d'atomicité des données de la première forme normale.
__________________
Email : http://scr.im/waldar |
|
00
|
|
|
#3 | ||||
|
Membre Expert
![]() Pacman PacmanBusiness analyst Inscription : juin 2004 Messages : 1 417 ![]() |
Salut !
Citation:
Citation:
Code :
=> Avec SUBSTR tu découpes la chaîne d'une position A, pour un nombre de caractères B (si le deuxième paramètre est omis, c'est jusqu'à la fin) => avec lpad, tu "shiftes" une chaîne en remplissant avec le troisième paramètre Voilà (Bien sûr, si tu veux ajouter ça dans la définition de la vue, il sera plus facile d'utiliser les colonnes d'origine)
__________________
(c'est ma photo) Paku, Paku ! Pour les jeunes incultes : non, je ne suis pas un pokémon... Le pacblog : http://pacmann.over-blog.com/ |
||||
|
00
|
|
|
#4 | |
|
Membre chevronné
![]() Administrateur de base de données Inscription : août 2009 Messages : 404 ![]() |
Bonsoir,
Citation:
![]() Le paragraphe auquel vous faites référence explique d'ailleurs que la notion d' "atomicité" est ambigüe et maintenant obsolète. Pour un exemple de violation de première forme normale, voir par exemple : La première forme normale [Résolu] Cela dit, je suis d’accord sur le fait qu'il s'agit ici certainement d'une erreur de modélisation et qu'il serait intéressant de créer deux colonnes. Une vue pourra éventuellement reconstruire le numéro de commande pour les utilisateurs. |
|
|
|
00
|
|
|
#5 |
|
Membre habitué
![]() Inscription : novembre 2008 Messages : 238 ![]() |
Bonjour,
Je travaille sur un ERP sur lequel il est possible de définir le n° de commande tel quel afin que sur un écran de liste des commandes on puisse trier par celui-ci. Chose faite très rapidement puisque cela ne fonctionne que pour les n° de séquence ayant le même nombre de caractères ! Merci pour vos réponses. Julien. |
|
|
00
|
|
|
#6 |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 954 ![]() |
Pour être vrai, la notion de 1FN à besoin du contexte de modélisation. Or à l'évidence, la requête demandée est catastrophique dans le modèle présenté par la vue.
Mais peut être la vue a fait une synthèse de deux colonnes.... Si dans la table cette données est en une seule colonne alors la 1FN n'est pas respectée compte tenu du contexte ! Lisez ce que je viens de publier à ce sujet : http://blog.developpez.com/sqlpro/p1...ances-petites/ 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
|
|
|
#7 | ||
|
Membre chevronné
![]() Administrateur de base de données Inscription : août 2009 Messages : 404 ![]() |
Citation:
Nous n'avons pas la même compréhension de la définition de 1NF. Apparemment votre position n'a pas évoluée depuis cette discussion à ce sujet avec fsmrel ou vous semblez être en désaccord. Je me range du côté d'fsmrel à ce sujet. Citation:
Bonne journée |
||
|
|
00
|
|
|
#8 | |||
|
Membre Expert
![]() Pacman PacmanBusiness analyst Inscription : juin 2004 Messages : 1 417 ![]() |
Pour moi, ce sont des problématiques différentes :
- La discussion dont tu donnes le lien traite de colonnes distinctes qui forment en quelques sortes une liste (et là oui, ça n'a presque rien à voir avec le 1NF). Dans la mesure où la liste des colonnes est fixe, le problème est à mon sens assez proche de celui de l'acceptation du NULL - Ici, on se pose la question : est-ce qu'une colonne résultant sémantiquement de la composition /concaténation de deux autres colonnes respecte où non le principe de l'atomicité, et donc la 1NF ? Pour cette dernière question, il y a plusieurs interprétations, et même plusieurs axes d'interprétations. Si on reprend le poste de fsmrel, les différentes précisions qu'ils citent n'ont à mon goût pas le même sens : Citation:
( Citation:
Citation:
1) L'équivalence entre "être atomique" et "ne pas être une liste ou un ensemble" n'est pas immédiate (bien entendu, pour moi il n'y a pas d'équivalence ici...). Dans le cas du numéro résultant de la concaténation de deux données définies, on peut penser que la valeur n'est pas atomique. Par contre, je ne vois pas du tout en quoi elle constituerait une liste ou un ensemble. 2) Mais même si on considère la notion d'atomicité, on peut au minimum se poser cette question : est-ce que le lien entre cette donnée concaténée et ces composantes sont fixes en un point du temps, ou dynamique ? En gros, supposons que pour la ligne donnée, le numéro de séquence puisse changer (paraît absurde ici, mais bon), on pourrait cependant vouloir garder la n° de commande (genre parce qu'il a déjà été communiqué au client). Dans ce cas, il faudrait que la vue ne fasse non pas la concaténation des deux données, mais ailles chercher dans une table d'historique les valeurs au moment de la création de la ligne... (plus chiant déjà) [EDIT] Ah tiens juju05, en dehors des débats sur la forme (ou le fond ?
__________________
(c'est ma photo) Paku, Paku ! Pour les jeunes incultes : non, je ne suis pas un pokémon... Le pacblog : http://pacmann.over-blog.com/ |
|||
|
00
|
|
|
#9 | |
|
Membre chevronné
![]() Administrateur de base de données Inscription : août 2009 Messages : 404 ![]() |
Nous sommes d'accord.
La définition de la 1NF a évoluée. La notion d' "atomicité" utilisée par Ted Codd à la naissance du Model Relationnel n'est plus à utiliser. Elle est trop ambigüe. La valeur 'Pierre' pour une colonne prénom est-elle atomique, non-décomposable par le SGBDR ? Une valeur '2009-1234' pour une colonne numéro de commande, ou une valeur '13;90;78' pour une colonne listeClient ne viole pas la 1NF. Utilisons la définition suivante : Normalisation 2.7 Citation:
|
|
|
|
10
|
|
|
#10 | |||
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 271 ![]() |
Citation:
Citation:
Si c'est le cas je trouve cela tiré par les cheveux. Citation:
|
|||
|
|
00
|
|
|
#11 | |||
|
Membre chevronné
![]() Administrateur de base de données Inscription : août 2009 Messages : 404 ![]() |
Citation:
Citation:
Cette valeur ('13;90;78') n'est pas une liste de VARCHAR(50). Toujours en ayant en tête: Citation:
Mais du point de vue du domaine, du type qui définit la colonne ce n'est pas une liste. C'est une valeur. Respect de 1NF. Voir l'exemple de violation dans ce sujet là, où j'ai utilisé une colonne qui prend pour valeur des relations à la place de varchar, mais c'est la même idée. |
|||
|
|
10
|
|
|
#12 |
![]() ![]() |
Donc en gros, tant qu'on ne fait pas de tables imbriquée on ne viole pas la 1NF ?
__________________
Email : http://scr.im/waldar |
|
00
|
|
|
#13 | |
|
Membre chevronné
![]() Administrateur de base de données Inscription : août 2009 Messages : 404 ![]() |
Citation:
Par définition toute relation est en 1NF. Une table est en 1NF, qu'elle contiennent des listes dans les colonnes (col1, col2) ou des listes de valeurs pour une colonne 'cli1, cli2'. C'est des considérations qui concernent la modélisation. Dans la pratique, je ne voit pas comment créer une table qui ne respecte pas la 1NF, mis à part autoriser NULL, qui n'est pas une valeur. PS: La création d'une table sans contrainte de clé étrangère ni contrainte d'unicité est potentiellement une violation de 1NF puisqu'il y a possibilité d'insérer des doublons. |
|
|
|
10
|
|
|
#14 | ||
![]() ![]() |
C'est faisable avec les SGBD qui gèrent les objets, Oracle par exemple :
Code :
__________________
Email : http://scr.im/waldar |
||
|
00
|
|
|
#15 |
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 271 ![]() |
|
|
|
00
|
|
|
#16 | |||
|
Membre Expert
![]() Pacman PacmanBusiness analyst Inscription : juin 2004 Messages : 1 417 ![]() |
Ben ça va un peu plus loin : 1NF ne veut rien dire, et on s'en fout de 1NF. Car :
1) S'il faut que toutes les colonnes soient non nullables pour que la table soit 1NF, on peut juste arrêter de se poser la question "est-ce que cette table est 1NF". Parce qu'à part les moments de débats purement théoriques qu'on peut avoir fsmrel, je pense que le fait que des colonnes soient nullables ne pose de problème à personne. (du moins, je n'ai jamais vu personne en faire la remarque sur un cas concret) Et sérieusement, vous en avez beaucoup chez vous, des tables sans colonnes nullables ? Code :
Bref c'est juste un problème de termes, on aurait du se limiter ici à l'expression "modélisation discutable"... Au passage quand même et toujours dans le même ordre d'idée : Citation:
En gros s'il y a pour moi la même différence entre : - Etre "en relation avec un sac vide" et "ne pas être en relation" et - Etre "en relation avec null" et "ne pas être en relation" On pourrait pousser le vice jusqu'à dire qu'un attribut est une relation à une colonne avec un entête, et remplacer le null par une relation vide à une colonne... D'un point de vue SQL, il y a tant de chose squi ne sont pas relationnelles (comme le SELECT par exemple !), mais au final, on a la clôture algébrique de "l'algèbre resultset SQL", et on fait pas mal de chose avec !
__________________
(c'est ma photo) Paku, Paku ! Pour les jeunes incultes : non, je ne suis pas un pokémon... Le pacblog : http://pacmann.over-blog.com/ |
|||
|
10
|
|
|
#17 | |
|
Membre chevronné
![]() Administrateur de base de données Inscription : août 2009 Messages : 404 ![]() |
Je suis plus ou moins d'accord oui.
A la base je suis intervenu pour signaler que la table décrite dans le premier message de ce topic respecte la 1NF contrairement à ce qui est écrit dans le second message ou ce qui peut être écrit par SQLPro. On fait appelle un peu vite au viol de la 1NF alors que c'est rarement le cas. Citation:
|
|
|
|
10
|
Copyright © 2000-2012 - www.developpez.com