IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Schéma Discussion :

Association n-aire, date et cardinalité [MCD]


Sujet :

Schéma

  1. #41
    Membre du Club
    Inscrit en
    Février 2007
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 138
    Points : 64
    Points
    64
    Par défaut
    Bonsoir fsmrel

    Votre avant dernière intervention, m'a fait ouvrir les yeux sur beaucoup de trucs très interessants, mais vu mes connaissances très limités j'ai pas parvenu à tout comprendre. En fait j'ai plus ou moin saisi la première partie du poste mais lorsque ca arrive aux index je me suis trouvé totalement perdu.

    Une question en passant : LACTATION et CTRL_LACTATION sont-elles des entités-types fortes ou faibles ? Si elles sont fortes, on ne touche pas au mode d’identification, sinon...
    Donc si j'ai bien compris une entité doit être considéré comme forte, si son existance ne dépend pas d'autres entités. Autrement dit si la suppression d'une occurence d'entité engendrera la suppression d'autres entités ces derniers doivent être considérés comme entités faibles (cad elles doivent être identifiées relativement).
    En se basant alors sur ce que j'ai compris, les entités LACTATION et CTRL_LACTATION que j'ai considéré initialement (par ignorance) des entités fortes seront transformées en entités faibles.
    Merci à vous pour m'avoir clarifier ce point qui me paraissait très ambigue


    J’ignore quel est votre niveau de connaissance en matière d’index, ....
    Pour que les choses soient claires, je dois vous mettre au courant que mes connaissances sont très limitées dans ce domaine, en fait j'avait une petite expérience dans le domaine de developpement logiciel, dans mes premiers logiciels j'utilisais pour le stockage des données les fichiers .txt, et je vous pouvez imaginer les énormes difficultés que j'ai rencontré en adoptant cette méthode de stockage....
    Maintenant je suis en période de projet de fin d'étude, et là je dois impérativement utiliser une base de donnée primo parce que le logiciel est bien beacoup plus compliqué que ceux que j'ai déjà developpé, ce qui rend "mission impossible" l'utilisation des fichier .txt, secondo parce que tout simplement, à ma soutenance qui aura lieu en juin les membres du jury n'accepteront surement pas une telle méthode.

    Bref, je suis très motivé à me renseigner sur tout ce qui concerne les bases de données mais là avec tous les informations que vous venez de fournir je ne sais plus d'où commencer.
    Je sollicite alors à nouveau votre générosité, pour guider mon chemin de recherche à ce sujet, sachant que je me suis bien renseigné au niveau MCD, et que je me suis assez bien renseigné au niveau MLD, et que je n'ai aucune connaissance (à part ce que j'ai essayé de comprendre de votre poste) ni au niveau MPD, ni au niveau SQL, ni les Index ...
    Ce que je vous demande alors (ce sera vraiment très apprécié) c'est de me fournir si possible, des liens vers des cours de votre choix.

    Voilà, je me sens vraiment incapable d'exprimer mes sentiments de gratitude envers votre générosité, dommage que tout ce que je peux faire c'est vous dire merci beaucoup Monsieur fsmrel, et vraiment du fond du coeur.

  2. #42
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 089
    Points : 31 346
    Points
    31 346
    Billets dans le blog
    16
    Par défaut
    Bonsoir,


    Citation Envoyé par CinePhil Voir le message
    Là j'ai plus de mal...
    Je reprends donc le fil de mes tentatives d’explication et passe aux index. Dans ce qui suit, je me limiterai à la façon dont travaille DB2 for z/OS dans les versions précédant la V9, laquelle comporte des raffinements pouvant à l’occasion rendre incomplètes, voire caduques certaines de mes explications.

    Un index DB2 est un arbre équilibré (balanced tree) ; comme je l’ai déjà dit, cela signifie que toutes les feuilles sont à la même distance de la racine, autrement dit, le temps d’accès est le même pour toutes les feuilles. Ceci est capital quand il s’agit de s’attaquer au réglage des performances, lesquelles seraient aléatoires si l’arbre n’était pas équilibré. Les index sont donc le plus souvent, des arbres B, et dans le cas de DB2 ce sont même des B+, je reviendrai un peu plus loin sur cette particularité.

    N.B. J’ai écrit que le temps d’accès est le même pour toutes les feuilles : ceci est vrai quand l’index vient d’être créé ou réorganisé, mais au fil du temps il peut y avoir une dégradation perceptible des performances du fait de nombreuses mises à jour, et il est alors préférable de procéder à une réorganisation de l’index. DB2 met à notre disposition, dans son catalogue, toutes informations utiles à cet effet.

    Observons maintenant comment DB2 (disons version 5) organise un index. Celui que je dépiaute (appelons-le MEMBRE_X1) est destiné à contenir les valeurs de la clé primaire de la table MEMBRE des membres de DVP : '0012' (valeur de la clé primaire du membre CinePhil), '4089' (valeur de la clé primaire du membre Fsmrel), etc.

    Supposons que l’index vient d’être défini et vide. Lors du premier INSERT, par exemple du membre SQLpro dans la table MEMBRE, DB2 crée un enregistrement dans le table space d’accueil des images des lignes de la table. Appelons MEMBRE_TS ce table space.



    La page P1 contient un certain nombre d’informations « système », dont une petite table appelée id map contenant l’adresse dans P1 de la ligne qui vient d’être insérée. Le rôle de l’id map est capital : les index branchés sur la table ne connaîtront jamais l’adresse exacte d’une ligne dans le table space, mais seulement l’adresse de la page P1 et le numéro du poste (invariable) de cette ligne dans l’id map (1 dans l’exemple). Ainsi, si les enregistrements bougent dans la page, ou sont carrément expulsés vers d’autres pages (« Ôte-toi de là, que je m’y mette ! » dit le gros enregistrement au petit), ces phénomènes n’auront aucun impact sur les valeurs connues par les index (dans l’exemple, la seule information connue est 'P1,1', à savoir l’adresse de la page et le numéro de poste dans l’id map).

    Concernant l’index MEMBRE_X1, DB2 réalise les opérations suivantes à l’occasion de ce premier insert :
    —Création de la page racine et d’une page feuille.

    — DB2 note dans la page feuille les coordonnées de SQLpro dans MEMBRE_TS, à savoir un record identifier (RID), composé du numéro de la page hébergeant SQLpro, et du numéro qui lui est affecté dans l’id map : 'P1,1'.
    — DB2 note dans la page racine la plus grande valeur de clé au niveau inférieur et l’adresse de celle-ci (symbolisée par '').


    Effectuons un deuxième INSERT, par exemple du membre CinePhil. Il reste de la place dans la page P1 du table space MEMBRE_TS, et elle ressemblera à quelque chose comme ceci :



    L’id map s’est enrichie d’un élément (poste), portant le numéro 2 et contenant l’adresse dans P1 du nouvel enregistrement.

    L’index MEMBRE_X1 est mis à jour en conséquence :

    La feuille est enrichie d’un élément permettant d’adresser dans MEMBRE_TS le membre dont la valeur de clé est égale à '0012'. Les éléments dans la feuille sont triés, ce qui fait que l’élément "3500 (RID = 'P1,1')" passe derrière le nouvel arrivant.

    La racine ne change pas de contenu, par construction elle conserve toujours la plus grande valeur de clé de la feuille cible.



    Les inserts se suivent et se ressemblent : Fsmrel (clé = '4089'), Antoun (clé = '0967'), etc.

    Au fil de ces inserts, le table space contiendra de plus en plus de pages et l’index suivra. A un moment donné, il n’y aura plus assez de place dans la feuille F1 : DB2 créera une feuille supplémentaire F2 et en notera l’adresse dans la racine. Dans la figure ci-dessous, la racine contient donc deux entrées, une pour F1 et une pour F2. Chaque entrée contient la plus grande valeur de clé pour chaque feuille ainsi que l’adresse de celle-ci.

    La séquence des clés doit être strictement respectée, aussi les feuilles seront-elles chaînées à cet effet : ceci favorise les traitements de masse (batch) pour lesquels les requêtes SQL SELECT comportent une clause ORDER BY (attention, au sein des pages de données, P1, etc., les lignes ne sont pas triées). Ce chaînage des feuilles fait que les index DB2 ne sont pas seulement des arbres B, mais B+.



    Si l’on soumet l’instruction :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT  NOM 
    FROM    MEMBRE  
    WHERE   MembreId = '3500'
    Alors DB2 lira le contenu de la racine de l’index Membre_X1, et comme '3500' est supérieur à '0967' et inférieur à '4089', ce sera la feuille F2 qui sera lue à son tour. La lecture suivante sera celle de la page de données P1. La consultation de l’id map permettra de retrouver les données du membre '3500'.

    Les inserts continuant, de nouvelles feuilles vont être crées et le nombre d’entrées dans la racine croîtra en conséquence. Arrivera un moment où à son tour elle sera pleine :

    C’est alors que DB2 effectue un split de cette racine, en en répartissant l’ensemble des éléments dans deux pages, pour moitié entre chacune d'elles. Mais comme par définition la racine ne comporte qu’une page, ces deux pages deviennent des nœuds intermédiaires et une nouvelle racine est créée, n’adressant plus cette fois-ci les feuilles, mais ces nœuds intermédiaires. Je résume la situation dans le dessin ci-dessous, extrait d’un cours que j’ai monté il y a vingt ans (DB2 V2) et que j’ai retouché pour les besoins de la cause :





    A chaque fois que la racine sera pleine, il y aura split et création d’un nouveau niveau intermédiaire.


    Quelques estimations

    Revenons-en aux bovins. L’attribut ID_FEMELLE composant la clé primaire est du type Integer. Je me sers à nouveau de DB2 Estimator pour tout savoir sur l’index FEMELLE_PK_X ayant pour clé ID_FEMELLE. Pour 67 000 000 de têtes, les chiffres sont les suivants :
    La taille de la clé est de 4 octets.

    La taille de chaque page est de 4 KB. Comme dans le cas du table space, j’ai prévu un free space de 20% par page et une page complètement libre après chaque paquet de 15 pages.

    =>

    Nombre de niveaux d’index : 4.

    Racine : 1 page.

    Niveau intermédiaire 1 : 3 pages.

    Niveau intermédiaire 2 : 689 pages.

    Niveau feuille : 228 669 pages.

    Je fais observer à cette occasion que, vu le grand nombre de lignes de la table, il est souhaitable de partitionner le table space en sous-table spaces, correspondant chacun à une fourchette de clés. Le but est de pouvoir effectuer les tâches de service (sauvegardes, restaurations, réorganisations, chargements incrémentaux) non pas pour un table space gigantesque, mais pour des partitions de taille beaucoup plus réduite. De même, cela permet de paralléliser les traitements de masse. Tout ceci est évidemment transparent pour la table, autrement dit les applications ne sont pas affectées (sinon que leurs performances ne peuvent qu'être améliorées).

    Incidemment, si l’on partitionne le table space utilisé pour la table FEMELLE et que le critère de partitionnement est l’attribut ID_FEMELLE, DB2 Estimator nous apprend que l’on gagne un niveau d’index :

    Pour 10 partitions :

    Nombre de niveaux d’index : 3.

    Racine : 1 page.

    Niveau intermédiaire : 76 pages.

    Niveau feuille : 24 908 pages.
    Pour 80 partitions :

    Nombre de niveaux d’index : 3.

    Racine : 1 page.

    Niveau intermédiaire : 10 pages.

    Niveau feuille : 3 114 pages.
    Concernant l’index FEMELLE_NOM_X ayant pour clé l’attribut FEMELLE_NOM (de type VARCHAR(32)) :

    Intuitivement, cet index est bien plus volumineux que le précédent (du moins dans sa version non partitionnée). En effet, DB2 (V8) considère que cette clé mesure exactement 32 octets. Paradoxalement, c’est le contraire qui aura toutes les chances de se produire...

    Il faut en effet tenir compte d’un paramètre important, à savoir en moyenne combien de vaches portent le même nom. Supposons qu’un 'COUNT (DISTINCT FEMELLE_NOM)' nous apprenne qu’il y a 6 700 000 noms distincts. Ce ne sont pas 67 000 000 valeurs de clés qui seront stockées dans l’index, mais dix fois moins : chaque valeur ne figure qu’une fois, accompagnée des RID (4 octets chacun) de chaque homonyme. Dans ces conditions, DB2 Estimator annonce :

    Nombre de niveaux d’index : 4.

    Racine : 1 page.

    Niveau intermédiaire 1 : 28 pages.

    Niveau intermédiaire 2 : 2 346 pages.

    Niveau feuille : 199 405 pages, contre 228 669 pages ci-dessus.

    Si le nombre de noms distincts est de 500 000, soit en moyenne 130 bêtes portant le même nom, les chiffres sont les suivants :
    Racine : 1 page.

    Niveau intermédiaire 1 : 19 pages.

    Niveau intermédiaire 2 : 1 534 pages.

    Niveau feuille : 130 351 pages.
    Mais le nombre de niveaux d’index reste égal à 4.

    A noter que DB2 for z/OS V9 autorise la compression des clés dans les index, mais malheureusement DB2 Estimator ne va pas au-delà de la V8, ce qui pour l’observation est gênant, mais bon...
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  3. #43
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 : 16 799
    Points : 34 046
    Points
    34 046
    Billets dans le blog
    14
    Par défaut
    Merci pour ces jolis schémas. Je peux éventuellement les reprendre dans mon mémoire d'ingénieur ? Avec citation de l'auteur et référence vers cette file de message dans la bibliographie bien sûr ! Pas sûr que j'en aie besoin mais ça ne coûte rien de demander.

    Cependant, si j'ai maintenant bien compris comment l'index est organisé pour la clé primaire, j'en reviens à ma question pour les autres index de la table, comme le nom de la vache. J'adapte mon ancienne question ci-dessous à mes nouvelles connaissances acquises grâce à vous.
    Allons plus loin en ajoutant un index sur le nom de la vache. Celui-ci sera t-il un nouvel index indépendant de l'autre et qui aura la forme suivante ?
    Racine : 'Zaza'

    Feuille F1 :
    'Blanchette' (RID = 'P1,2')
    'Marie' (RID = 'P1,3')
    'Pervenche' (RID = 'P1,4')
    'Zaza' (RID = 'P1,1')

    Ou bien tiendra t-il compte de l'index de la clé primaire ?
    Racine : 'Zaza'

    Feuille F1 :
    'Blanchette', 2 (RID = 'P1,2')
    'Marie', 3 (RID = 'P1,3')
    'Pervenche', 4 (RID = 'P1,4')
    'Zaza', 1 (RID = 'P1,1')
    Et dans le cas d'un index multicolonnes, par exemple sur le nom + la race (un peu idiot comme exemple mais bon...), ça donnerait un truc dans le genre ?
    Racine :
    'Marie', 'Limousine'
    'Zaza', 'Charolaise'

    Feuille F1 :
    'Blanchette', 'Limousine' (RID = 'P1,2')
    'Marie', 'Charolaise' (RID = 'P2,6')
    'Marie', 'Charolaise' (RID = 'P3,2')
    'Marie', 'Limousine' (RID = 'P1,3')
    ...

    Feuille Fx :
    ...
    'Zaza', 'Charolaise' (RID = 'P1,1')

    Autre question à propos de ça :
    Ainsi, si les enregistrements bougent dans la page, ou sont carrément expulsés vers d’autres pages (« Ôte-toi de là, que je m’y mette ! » dit le gros enregistrement au petit),
    Quel est ce phénomène ?
    A quelle occasion peut-il se produire ?
    Cela n'entraîne t-il pas alors une réorganisation des index ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 !

  4. #44
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 089
    Points : 31 346
    Points
    31 346
    Billets dans le blog
    16
    Par défaut
    Bonsoir,


    Citation Envoyé par master_och Voir le message
    [...]lorsque ca arrive aux index je me suis trouvé totalement perdu.
    Il est de loin préférable que vous produisiez des MCD bien en phase avec l’objet de votre étude. Une fois maîtrisés les concepts de la modélisation, le reste suit. Les index sont un sujet dont l’étude est secondaire : comme je le rappelle de temps en temps, on passe au niveau du fer à souder, pour installer les turbos permettant de rendre les accès performants, aussi ne vous prenez pas la tête avec ça. Une fois votre MCD stabilisé, vérifiez au niveau MLD que l’ordre de rangement des attributs dans les clés est correct, en vous basant sur l’importance d’un attribut par rapport à un autre. Par exemple, puisque vous avez conclu que l’entité-type LACTATION était faible relativement à l’entité-type FEMELLE, au niveau du MLD l’ordre des attributs dans la clé primaire de la table LACTATION sera le suivant :
    ID_FEMELLE, ID_LACT,
    et non pas celui-là :
    ID_LACT, ID_FEMELLE.
    De la même façon, l’ordre des attributs dans la clé primaire de LACTATION sera le suivant :
    ID_FEMELLE, ID_LACT, ID_CTRL.
    Les valeurs prises par ID_LACT sont théoriquement relatives à ID_FEMELLE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
       ID_FEMELLE    ID_LACT 
           1           1
           1           2
           1           3
           2           1
           2           2
          ...         ...
    Mais si cela vous simplifie la vie, vous pouvez être pragmatique et, sans qu’il y ait de contre-indication particulière, au lieu de recommencer la numérotation à 1 pour chaque bestiau, vous pouvez ne pas l’interrompre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
       ID_FEMELLE    ID_LACT 
           1           1
           1           2
           1           3
           2           4
           2           5
          ...         ...
    Simplement, un tatillon pourrait vous faire observer que la clé primaire devient une surclé, mais celui-là vous me l’enverrez, que je lui donne deux ou trois petites claques (relationnelles) pour qu’il ne nous embête plus.

    Pour en revenir au MCD : vous semblez avoir bien assimilé la dimension sémantique des objets, donc la classification des entités-types : fortes (par exemple FEMELLE, MALADIE) faibles (par exemple LACTATION, CTRL_LACTATION, ATTRAP, SOIN) associatives (par exemple ATTRAP, si sémantiquement vous préférez considérer cette entité-type comme associative plutôt que faible relativement à FEMELLE : il n’y a pas d’absolu et c’est heureux, sinon ça serait d’une tristesse...)

    Un point primordial consiste en la distinction entre « avoir » et « être ». Une femelle a des lactations, elle a des maladies, un taureau peut avoir (saillir) des femelles, mais un taureau n’est pas une vache, ils font l'objet d'une spécialisation. De même, une voiture a un carburateur mais elle n’est pas un carburateur. Je prends des cas évidents, mais parfois la subtilité n’est peut-être pas évidente. Quoi qu’il en soit, étudiez bien en ce sens la partie généralisation/spécialisation, thème vous avez abordé dans votre message du 18 février dernier.

    Si vous souhaitez malgré tout en savoir un peu plus sur les index, vous pouvez consulter le message à suivre, à l’attention de CinePhil qui se pose lui aussi des questions, mais plutôt d’ordre technique.


    Citation Envoyé par master_och Voir le message
    [...]En se basant alors sur ce que j'ai compris, les entités LACTATION et CTRL_LACTATION que j'ai considéré initialement (par ignorance) des entités fortes seront transformées en entités faibles.
    Parfait. Notons que l’instruction SQL permettant de créer la table LACTATION comportera une clause pour établir le lien entre les tables LACTATION et FEMELLE (Constraint FEMELLE_FK) :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE TABLE LACTATION (
         ID_FEMELLE      Int          NOT NULL
       , ID_LACT         INT          NOT NULL
       , DATE_LANCMT     DATE         NOT NULL
    ,  Constraint LACT_PK PRIMARY KEY (ID_FEMELLE, ID_LACT)
     , Constraint LACT_AK UNIQUE (ID_FEMELLE, DATE_LANCMT)
     , Constraint FEMELLE_FK Foreign key (ID_FEMELLE) references FEMELLE
                                                      on delete CASCADE 
    ) ;
    Vous noterez la présence d’un déclencheur, à savoir CASCADE, signifiant que la suppression d’une femelle entraîne celle de ses lactations.

    Une remarque quand même. De même que tout n’est pas blanc ou noir, une entité-type peut être moyennement faible. Considérez un MCD ou figure une entité-type CLIENT (identifié par ID_CLIENT) : cette entité-type est éminemment forte. Considérez maintenant les commandes d’un client : l’entité-type COMMANDE correspondante est-elle forte ou faible ? D’un côté, les commandes sont des propriétés multivaluées du client, donc COMMANDE serait une entité-type faible. D’un autre côté, il serait très dangereux d’autoriser la suppression de ses commandes au cas où l’on voudrait supprimer le client : COMMANDE serait plutôt une entité-type forte, à tout le moins qui résiste, et l’on s’interdira l’option CASCADE dans l’instruction CREATE TABLE COMMANDE. Néanmoins, j’identifierai COMMANDE relativement à CLIENT (le numéro de la commande n’étant alors qu’un identifiant alternatif, au même titre que l’attribut NUM_OFFICIEL l’est pour l’entité-type FEMELLE). En effet, il est capital pour les performances que l’identifiant se propage dans COMMANDE, puis dans LIGNE_COMMANDE (lignes de commande), puis dans LIGNE_ENGAGEMENT (engagements pour une ligne de commande), puis dans PCL (partie de commande livrable par engagement). Si je veux percuter lors de la recherche des parties de commandes livrables d’un client donné et éviter que le SGBD passe par les objets intermédiaires, il est impératif que l’attribut ID_CLIENT ait été propagé tout au long de la chaîne. Une fois de plus, le concepteur pur et dur, qui ne va jamais dans la soute, poussera des hauts cris : peu importe, l’intérêt de l’application passe avant. Je ne lui donnerai raison que lorsqu’au niveau des séances de prototypage des performances, il sera démontré que mon système ne vaut plus. Cela ne pourra guère se produire qu’avec l’arrivée d’un système de stockage des données radicalement différent de celui qu’utilisent aujourd’hui les SGBD.


    Citation Envoyé par master_och Voir le message
    [...]je suis très motivé à me renseigner sur tout ce qui concerne les bases de données mais là avec tous les informations que vous venez de fournir je ne sais plus d'où commencer.
    Evidemment, MCD, puis MLD. Accessoirement le MPD (disons les index). Je vous conseille de vous familiariser avec un SGD gratuit. Pour mes tets, J’utilise SQL Server 2005 Express Edition et je vous le recommande (ou la version 2008). Je suis loin d’être un expert de SGBD, mais chez Developpez.com vous pourrez solliciter les pointures du forum SQL Server. Vous réalisez votre MCD avec Win’Design, Power AMC ou autre bon outil (à défaut, vous pouvez vous rabattre sur MySQL Workbench, cf. mon message du 13 février dernier), vous en dérivez automatiquement le MLD, puis vous demandez la production des instructions de création des tables (voire des index...) Vous récupérez le fichier résultant (si c’est du .TXT, vous renommez en .SQL) et vous demandez à SQL Server d’exécuter les instructions. Vous effectuez quelques INSERT et SELECT, et vogue la galère. Pour ma part c’est comme cela que j’ai procédé au cours de nos discussions.


    Citation Envoyé par master_och Voir le message
    [...]Ce que je vous demande alors (ce sera vraiment très apprécié) c'est de me fournir si possible, des liens vers des cours de votre choix.
    Malheureusement, les cours que j’aurais pu vous recommander datent d’une époque à laquelle Internet n’existait pas et doivent dormir dans des cartons je ne sais où...
    Si possible, achetez l’ouvrage de Dominique Nanci, mais apparemment il est devenu indisponible. Voyez aussi l’article de Cyril Gruau, ou encore l’ouvrage de Michel Diviné (qui est très bien pour ce qui concerne le MCD, mais ce qu’il a écrit sur le MLD (version relationnelle) est à oublier).

    Bon courage à vous, le puzzle va se mettre en place, vous êtes sur la bonne voie.
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  5. #45
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 089
    Points : 31 346
    Points
    31 346
    Billets dans le blog
    16
    Par défaut
    Bonsoir,


    Citation Envoyé par CinePhil Voir le message
    Merci pour ces jolis schémas. Je peux éventuellement les reprendre dans mon mémoire d'ingénieur ?
    Vous pouvez reprendre ce que vous voulez, puisque c’est pour la bonne cause....

    Citation Envoyé par CinePhil Voir le message
    Allons plus loin en ajoutant un index sur le nom de la vache. Celui-ci sera t-il un nouvel index indépendant de l'autre et qui aura la forme suivante ?
    Racine : 'Zaza'

    Feuille F1 :
    'Blanchette' (RID = 'P1,2')
    'Marie' (RID = 'P1,3')
    'Pervenche' (RID = 'P1,4')
    'Zaza' (RID = 'P1,1')

    Ou bien tiendra t-il compte de l'index de la clé primaire ?
    Racine : 'Zaza'

    Feuille F1 :
    'Blanchette', 2 (RID = 'P1,2')
    'Marie', 3 (RID = 'P1,3')
    'Pervenche', 4 (RID = 'P1,4')
    'Zaza', 1 (RID = 'P1,1')
    Pourquoi voudriez-vous que DB2 tienne compte de l’index de la clé primaire (à supposer que celle-ci ait été définie...) quand vous créez un index sur le nom de la vache ? En revanche, si cela vous arrange, vous pouvez vous-même obtenir l’équivalent.

    En effet, au lieu de coder :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Create index FEMELLE_NOM_X On FEMELLE
                 (FEMELLE_NOM)
                  ...
    Il vous suffit de coder :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Create index FEMELLE_NOM_X On FEMELLE
                 (FEMELLE_NOM, ID_FEMELLE)
                  ...


    Citation Envoyé par CinePhil Voir le message
    Et dans le cas d'un index multicolonnes, par exemple sur le nom + la race (un peu idiot comme exemple mais bon...), ça donnerait un truc dans le genre ?
    Racine :
    'Marie', 'Limousine'
    'Zaza', 'Charolaise'

    Feuille F1 :
    'Blanchette', 'Limousine' (RID = 'P1,2')
    'Marie', 'Charolaise' (RID = 'P2,6')
    'Marie', 'Charolaise' (RID = 'P3,2')
    'Marie', 'Limousine' (RID = 'P1,3')
    ...

    Feuille Fx :
    ...
    'Zaza', 'Charolaise' (RID = 'P1,1')
    Ça donne effectivement quelque chose comme cela. Les colonnes se suivent à la queue leu leu dans les pages de l’index, avec quelques aménagements. Ainsi, puisque la colonne FEMELLE_NOM est du type VARCHAR(32), que la page de l’index soit une feuille ou non, DB2 procède comme si le type de la colonne était CHAR(32), en complétant à droite par des zéros binaires. C’est tout du moins ce qui se passe avec les versions de DB2 antérieures à la V9 (à partir de la V9, je ne sais pas comment ça se passe). Si la race est aussi du type VARCHAR(24), considérez que la clé occupe 32 + 24 = 56 octets.

    (Au niveau supérieur, noeud intermédiaire ou racine, n’oubliez pas de rappeler à l'aide d'un mickey que la clé de 56 octets est accompagnée de l’adresse de la feuille.)


    Citation Envoyé par CinePhil Voir le message
    Autre question à propos de ça :
    Ainsi, si les enregistrements bougent dans la page, ou sont carrément expulsés vers d’autres pages (« Ôte-toi de là, que je m’y mette ! » dit le gros enregistrement au petit),
    Quel est ce phénomène ?
    A quelle occasion peut-il se produire ?
    Cela n'entraîne t-il pas alors une réorganisation des index ?
    Dans le cas normal, quand dans le table space une page Px n’a plus assez de place pour accueillir un nouvel enregistrement qui doit être inséré précisément dans cette page (il faudra que je vous parle à ce sujet des index CLUSTER), DB2 recherche une autre page Py disposant de la place nécessaire. L’insert est effectué et les index mis à jour en conséquence, sans aucune conséquence néfaste pour eux. Je ne rentre pas dans les détails, mais la recherche de la page Py est extrêmement rapide et le choix de cette page est axé sur la plus grande proximité de Px et Py. Le but de la manœuvre est que la performance des traitements de masse ne soit pas affectée, sachant que DB2 lit alors les pages par rafales (disons 64 pages d’un coup, à 4 fois moins cher qu’un accès unitaire).

    Quand j’écris " « Ôte-toi de là, que je m’y mette ! » dit le gros enregistrement au petit "... Cette façon de procéder ne poserait techniquement aucun problème à DB2, mais comme ça n’est pas très moral, je remplace cette injonction par la suivante « Ôtez-moi de là, j’étouffe ! » C’est ce que dirait un enregistrement qui grossit à l’occasion d’un UPDATE, de telle sorte qu’il n’y a plus assez de place dans la page pour le contenir en entier. Si le fait de dégager un tout petit enregistrement suffisait pour que le gros tienne (version pas morale), DB2 pourrait effectivement envoyer le petit dans une autre page. En réalité, c’est le gros qui est puni et transféré dans l'autre page.

    Pour répondre précisément à votre question : « Cela n'entraîne-t-il pas alors une réorganisation des index ? », je réponds tout de suite négativement, comme dans le cas de l'insert. Suite à update, le changement de page d’un enregistrement, qu’il s’agisse du gros ou du petit est totalement transparent en ce qui concerne les index. En effet, le RID initial de cet enregistrement n’est pas remplacé. Pourquoi ?

    Après que l’enregistrement a été déplacé dans une autre page, le poste qui lui est affecté dans l’id map continue à adresser son ancien emplacement, mais au lieu d’y trouver l’enregistrement, on trouve son RID dans la page qui désormais l’héberge. La place rendue disponible est remise à disposition, elle n’est évidemment pas perdue.

    Exemple ; CinePhil grossit et ne tient plus dans la page P1.

    Situation initiale :



    Après expulsion de CinePhil dans la page voisine P8 qui peut l’accueillir :



    Si CinePhil continue à grossir et ne tient plus dans la page P8, DB2 cherchera une nouvelle page, trouvera par exemple la page P14, logera CinePhil dans celle-ci, mettra à jour la page P1 en remplaçant le RID 'P8, 5' par exemple par le RID 'P14, 18' puis libérera la place dans la page P8.

    N.B. On observera que dans tous les cas, il y a au maximum un accès physique supplémentaire pour chercher un enregistrement qui a bougé. A l’attention du DBA, DB2 comptabilise ces opérations d’évacuation, et c’est consigné dans les tables du catalogue. Quand le DBA trouvera que ça a trop bougé, il pourra déclencher une réorganisation du table space et des index.
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  6. #46
    Membre du Club
    Inscrit en
    Février 2007
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 138
    Points : 64
    Points
    64
    Par défaut
    Simplement, un tatillon pourrait vous faire observer que la clé primaire devient une surclé, mais celui-là vous me l’enverrez, que je lui donne deux ou trois petites claques (relationnelles) pour qu’il ne nous embête plus.
    Daccord je compte sur vous alors ...

    A propos des cours, ceux que vous venez de fournir semblent très interessants, surtout celui de Michel Diviné, merci bien pour les liens.

    Il me manque juste un cour sur le language SQL, mais bon je chercherai un dès que je finirai le livre de Michel Diviné, d'ailleur je relirai toutes vos remarques sur les Index et le niveau physique une fois renseigné sur le sujet .

    voilà, merci pour tout.

  7. #47
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 089
    Points : 31 346
    Points
    31 346
    Billets dans le blog
    16
    Par défaut
    Concernant SQL :

    http://sql.developpez.com/


    Good luck
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  8. #48
    Membre du Club
    Inscrit en
    Février 2007
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 138
    Points : 64
    Points
    64
    Par défaut
    Concernant SQL :

    http://sql.developpez.com/


    Good luck
    Le cour est bien détaillé, exactement comme je le veux.

    Merci bien.

  9. #49
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 : 16 799
    Points : 34 046
    Points
    34 046
    Billets dans le blog
    14
    Par défaut
    Pour master_och :
    Je viens de réaliser un MCD personnel (12 entités et une vingtaine d'associations dont deux ternaires) avec le logiciel gratuit Open Model Sphere et j'en suis plutôt content, sauf que je n'ai pas réussi encore à le faire fonctionner sous Linux.
    Il génère le MLD à partir du MCD et possède un outil de vérification de cohérence des schémas. Le MLD généré n'est cependant pas directement implémentable, il reste quelques manipulations manuelles à faire, ce qui permet de mettre les mains dans le cambouis et ne pas faire une confiance aveugle au schéma, ce qui pourrait s'avérer dangereux dans certains cas.

    Pour fsmrel :
    Merci encore pour toutes ces explications claires.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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. #50
    Membre du Club
    Inscrit en
    Février 2007
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 138
    Points : 64
    Points
    64
    Par défaut
    Bonsoir Cinephil

    Je vous remercie pour votre proposition, mais en fait j'utilise actuellement le logiciel Win'Design, et je suis tout à fait satisfait par ses fonctionalités.

    Merci quand même pour m'avoir fait part de cette information.

+ Répondre à la discussion
Cette discussion est résolue.
Page 3 sur 3 PremièrePremière 123

Discussions similaires

  1. Cardinalité sur association n-aire
    Par Spiff__ dans le forum Diagrammes de Classes
    Réponses: 2
    Dernier message: 30/06/2010, 15h54
  2. [MCD] cardinalité d'une association n-aire
    Par lidou87 dans le forum Schéma
    Réponses: 3
    Dernier message: 22/04/2009, 15h06
  3. [MCD] association n-aire et cardinalité.
    Par new_wave dans le forum Schéma
    Réponses: 2
    Dernier message: 12/04/2009, 19h13
  4. [DC] Implémentation d'une association n-aire (ternaire pour le coup)
    Par Kyrel dans le forum Diagrammes de Classes
    Réponses: 5
    Dernier message: 04/10/2007, 08h58
  5. association n-aire avec PowerAMC ?
    Par sara21 dans le forum PowerAMC
    Réponses: 1
    Dernier message: 25/05/2007, 02h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo