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

Décisions SGBD Discussion :

Changement de la base de données


Sujet :

Décisions SGBD

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 50
    Points : 29
    Points
    29
    Par défaut Changement de la base de données
    Bonjour,

    je me permets de poser une question ,sachant que je n'ai pas les compétences requises. Voici ma question:
    je suis développeur pour une grosse entreprise. Celle ci a décidé de refaire son environnement numérique. Beaucoup de services ont leur propre logiciel. Tous vont chercher les données dans une base de données unique.
    Le problème est que cette base de données est entièrement à refaire. J'entends par la que les tables créées ne sont pas du tout optimisées. En gros cela ressemble à un château de cartes, des tables, propriétés etc... ont été rajoutées au fur et à mesure des demandes.
    Pour le moment , on utilise des vues afin de pallier à ce manque. D'où la question :
    Il y a t'il un moyen de créer une base de données nouvelle tout en conservant l'ancienne, synchronisée en temps réelle avec celle ci, afin que l'on puisse migrer petit à petit l'ensemble des services.
    Ma grosse interrogation est sur les temps de réponse. Peut on travailler sur des bases différentes sans que la synchronisation entre l'ancienne et la nouvelle ne viennent nous gêner ? Ce qui me parait un peu utopiste, mais sinon quelle solution ?

    Cordialement
    Manu

  2. #2
    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 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Soit deux applications A1 et A2 qui utilisent la BDD.

    Cas 1) Les applications utilisent des tables totalement différentes dans la BDD
    Alors, il s'agit en fait peut-être, fonctionnellement, voire sémantiquement, de deux bases de données différentes. Il est donc relativement facile de créer la BDD et les vues et procédures nécessaires à la continuité du fonctionnement de l'application A1, d'arrêter l'application, de migrer les données vers la nouvelle BDD et de redémarrer l'application.
    Ensuite, on peut faire le ménage dans l'ancienne BDD et supprimer les données de l'application A1.
    Idem pour l'application A2.

    Cas 2) Les applications utilisent des données communes.
    Il faut alors concevoir et développer la nouvelle BDD ainsi que les vues et procédures utilisées actuellement par les applications puis arrêter toutes les applications pour migration des données et modification des paramètres de connexion à la BDD de toutes les applications.


    Les deux cas précédents sont à considérer si on ne veut ou peut pas toucher au code des applications.
    Si les applications sont développées en interne ou si on peut faire modifier leur code par un prestataire, il faut, là aussi, commencer par concevoir la nouvelle BDD puis modifier les applications l'une après l'autre pour leur faire utiliser la nouvelle BDD toute propre.

    Dans tous les cas, bien faire attention au contrôle de la cohérence des données lors du transfert ! Il est fort possible que vous ayez des données mortes, incohérentes, obsolètes... qu'il faudra nettoyer.
    Par exemple, vous trouverez peut-être les mêmes personnes morales dans les tables de l'application qui gère la prospection commerciale et dans celles de l'application qui gère les commandes client. Il conviendrait alors d'uniformiser un peu tout ça et c'est un boulot délicat.

    Ce que vous risquez de trouver aussi, ce sont des données qui furent liées à d'autres dans le passé et entre temps, le lien a été perdu parce que l'intégrité référentielle des données n'était pas assurée.
    Exemple : On fait des devis à des personnes (morales ou physiques) qui ne sont pas encore clientes. Les devis et les prospects sont alors bien reliés mais un jour on décide de faire le ménage et de supprimer tous les prospects de plus de 5 ans qui ne sont pas devenus clients. Manque de bol, il n'y avait pas de clé étrangère dans la table des devis pour référencer le prospect et vous vous retrouvez avec des devis sans prospect que vous ne pourrez pas enregistrer dans la nouvelle BDD puisque celle-ci sera correctement développée avec les clés étrangères qui vont bien.

    Quoi qu'il en soit... bon courage !
    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 !

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 763
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 763
    Points : 52 554
    Points
    52 554
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par manu49 Voir le message
    Bonjour,

    je me permets de poser une question ,sachant que je n'ai pas les compétences requises. Voici ma question:
    je suis développeur pour une grosse entreprise. Celle ci a décidé de refaire son environnement numérique. Beaucoup de services ont leur propre logiciel. Tous vont chercher les données dans une base de données unique.
    Le problème est que cette base de données est entièrement à refaire. J'entends par la que les tables créées ne sont pas du tout optimisées. En gros cela ressemble à un château de cartes, des tables, propriétés etc... ont été rajoutées au fur et à mesure des demandes.
    Pour le moment , on utilise des vues afin de pallier à ce manque. D'où la question :
    Il y a t'il un moyen de créer une base de données nouvelle tout en conservant l'ancienne, synchronisée en temps réelle avec celle ci, afin que l'on puisse migrer petit à petit l'ensemble des services.
    Ma grosse interrogation est sur les temps de réponse. Peut on travailler sur des bases différentes sans que la synchronisation entre l'ancienne et la nouvelle ne viennent nous gêner ? Ce qui me parait un peu utopiste, mais sinon quelle solution ?

    Cordialement
    Manu
    Tout dépends des outils dont dispose le SGBDR en question. Par exemple si cette base est hébergée par SQL Server, alors vous pouvez faire une réplication hétérogène via Service Broker. Mon collègue Arian papillon, doit d'ailleurs compléter la présentation qu'il à fait aux SQL Saturdays :
    http://blog.datafly.pro/post/Synchro...u-SQL-Saturday

    Mais pour que ceci fonctionne correctement avec de bonnes performances, il faut que la réplication soit unilatérale :
    1) la base ancienne fait les mises à jour qui sont envoyée en retour à la base nouvelle
    2) petit à petit, les applications se connectent à la base nouvelle pour les lectures, et les mises à jour sont renvoyées à la base ancienne qui les propage par réplication à la base nouvelle.
    Le temps de latence doit être minimal, ce qui est la cas avec Service Broker (au fil de l'eau, asynchrone, dès que disponible - via file d'attente)
    Pour faire les mises à jour sur la base nouvelle qui impacte la base ancienne, il faut utiliser des déclencheurs INSTEAD OFF et à nouveau utiliser Service Broker.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  4. #4
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 152
    Points : 7 402
    Points
    7 402
    Billets dans le blog
    1
    Par défaut
    Etant donné la présence actuellement de vues, et qu'une vue dans la plupart des SGBD est modifiable (CRUD) ne peut-on pas imaginer :
    - Remplacer les tables existantes par des vues de même structure, qui pointent sur des tables correctement réorganisées
    - Modifier petit à petit les programmes pour remplacer l'appel à ces vues par des appels à des vues métier et procédures stockées, afin de ne plus être dépendant du modèle des données

    Si le premier point est problématique, alors rien n'empêche de mettre en place petit à petit des procédures stockées et vues métiers dans les applications plutôt que des appels directs aux tables. Et une fois qu'il n'y a plus le moindre appel aux tables, on peut se lancer dans la remodélisation, en adaptant les procédures stockées et vues qui pointent sur la table modifiée.

    Par exemple, pour ce site, que j'ai voulu utiliser comme base pour faire un article, que j'ai eu la fénéantise d'écrire, c'est ce que j'ai fait.

    A aucun endroit dans le code je ne fais appel à la moindre table.

    Tables :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    animal
    question
    reponse
    partie
    partie_animal
    partie_question
    partie_reponse

    Procédures stockées :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    ApprendrePartie
    CreerPartie
    PrendreUnSeulAnimal
    GarderUnSeulAnimal
    TrouverMeilleureQuestion
    CreerAnimal
    CreerQuestion
    CreerReponse
    NettoyerPartie
    TerminerPartie

    Et fonctions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    TrouverMeilleureProposition
    NombreAnimaux
    NombreQuestions
    PartieNombreQuestions
    PartieNombreAnimaux
    TrouverNomAnimal
    AnimalLePlusConnu
    AnimalLeMoinsConnu
    AnimalLePlusJoue
    L'avantage, c'est que dans le code de l'application, j'ai pas une ligne de SQL.
    Mais aussi si demain je dois changer la structure de ma base, j'ai pas une ligne de code du programme à changer, uniquement les procédures stockées et fonctions.
    On ne jouit bien que de ce qu’on partage.

  5. #5
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 152
    Points : 7 402
    Points
    7 402
    Billets dans le blog
    1
    Par défaut
    Pour illustrer ma réponse, voici, un petit article, que je viens d'écrire. Reste plus qu'à trouver comment le publier sur DVP

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
     
    Soit une base de données de contacts, très mal modélisée :
    Une seule table
    Des colonnes nullables
    Une sémantique redondante entre certaines colonnes
     
    create table contact
    (
    	id int primary key not null identity,
    	nom varchar(50) not null,
    	prenom varchar(50) not null,
    	telephone_maison varchar(10) null check (telephone_maison like replicate('[0-9]', 10)),
    	telephone_mobile varchar(10) null check (telephone_mobile like replicate('[0-9]', 10)),
    	telephone_boulot varchar(10) null check (telephone_boulot like replicate('[0-9]', 10)),
    	unique (nom, prenom)
     
    );
     
    On souhaite effectuer des recherches simple en saisissant un numéro de téléphone. La recherche doit alors retourner toutes les lignes de contact où l’un des trois numéros de téléphone est égal au numéro rechercher.
    La table étant très mal modélisée, on a au départ tenté :
     
    select *
    from contact
    where telephone_maison = '0123456789' or telephone_mobile = '0123456789' or telephone_boulot = '0123456789';
     
    Mais malgré la création d’index, cette requête est très lente (le OR est non sargable) et franchement pas très jolie. Surtout qu’on a pour objectif d’ajouter un jour “telephone_conjoint”, donc il faudra modifier la requête.
     
    On a donc créé une vue permettant d’effectuer cette recherche plus facilement, et de façon plus performante :
     
    create view contact_telephone (id, nom, prenom, type_telephone, numero_telephone)
    as
    select id, nom, prenom, 'MAISON', telephone_maison
    from contact
    union
    select id, nom, prenom, 'MOBILE', telephone_mobile
    from contact
    union
    select id, nom, prenom, 'BOULOT', telephone_boulot
    from contact;
     
    Après mure réflexion, cette modélisation est parfaitement pourrie, et on souhaite l’améliorer.
     
    Seulement, on a un programme qui permet de faire du CRUD sur la table “contact”, et de faire des recherches à l’aide de la vue “contact_telephone”.
    Ce programme étant écrit en COBOL, et son auteur étant parti à la retraite à l’époque où vous ne saviez même pas encore lire, vous préférez éviter d’avoir à le toucher, même si, à terme, vous serez certainement amenés à le remplacer.
     
    Voici donc comment procéder.
     
    On va, dans un premier temps, créer les tables “propres”.
     
    create table personne
    (
    	id int primary key not null identity,
    	nom varchar(50) not null,
    	prenom varchar(50) not null,
    	unique (nom, prenom)
    );
     
    create table telephone
    (
    	id int primary key not null identity,
    	personne_id int not null references personne(id),
    	type_telephone varchar(6) not null check (type_telephone in ('MAISON', 'MOBILE', 'BOULOT')),
    	numero_telephone varchar(10) not null check (numero_telephone like replicate('[0-9]', 10))
    );
     
    Puis recopier notre table poubelle dedans :
     
    set identity_insert personne on;
    insert into personne (id, nom, prenom)
    select id, nom, prenom
    from contact;
    set identity_insert personne off;
     
    insert into telephone (personne_id, type_telephone, numero_telephone)
    select id, type_telephone, numero_telephone
    from contact_telephone
    where numero_telephone is not null;
     
    Et on va maintenant transformer la table poubelle en vue toute propre :
     
    drop table contact;
    go
     
    create view contact (id, nom, prenom, telephone_maison, telephone_mobile, telephone_boulot)
    as
    select p.id, p.nom, p.prenom, t1.numero_telephone, t2.numero_telephone, t3.numero_telephone
    from personne p
    left outer join telephone t1 on t1.personne_id = p.id and t1.type_telephone = 'MAISON'
    left outer join telephone t2 on t2.personne_id = p.id and t2.type_telephone = 'MOBILE'
    left outer join telephone t3 on t3.personne_id = p.id and t3.type_telephone = 'BUREAU';
    go
     
    Seul hic, si on tente de créer/modifier/supprimer des lignes, ça ne fait pas trop ce qu’on veut…
     
    INSERT :
    Msg 4405, Level 16, State 1, Line 75
    View or function 'contact' is not updatable because the modification affects multiple base tables.
     
    UPDATE :
    (0 row(s) affected)
    Lorsqu’on tente de mettre à jour un numéro de téléphone.
     
    DELETE :
    Msg 4405, Level 16, State 1, Line 79
    View or function 'contact' is not updatable because the modification affects multiple base tables.
     
    On va donc devoir créer quelques triggers pour gérer correctement les différents cas :
     
    create trigger trg_contact_ins
    on contact
    instead of insert
    as
    begin
    	insert into personne (nom, prenom)
    	select nom, prenom
    	from inserted;
     
    	insert into telephone (personne_id, type_telephone, numero_telephone)
    	select personne.id, 'MAISON', inserted.telephone_maison
    	from inserted
    	inner join personne on personne.nom = inserted.nom and personne.prenom = inserted.prenom
    	where telephone_maison is not null
    	union
    	select personne.id, 'MOBILE', inserted.telephone_mobile
    	from inserted
    	inner join personne on personne.nom = inserted.nom and personne.prenom = inserted.prenom
    	where telephone_mobile is not null
    	union
    	select personne.id, 'BOULOT', inserted.telephone_boulot
    	from inserted
    	inner join personne on personne.nom = inserted.nom and personne.prenom = inserted.prenom
    	where telephone_boulot is not null;
    end;
    go
     
    create trigger trg_contact_del
    on contact
    instead of delete
    as
    begin
    	delete telephone where personne_id in (select id from deleted);
    	delete personne where id in (select id from deleted);
    end;
    go
     
    create trigger trg_contact_upd
    on contact
    instead of update
    as
    begin
    	update personne
    	set nom = i.nom, prenom = i.prenom
    	from inserted i
    	where personne.id = i.id and (personne.nom <> i.nom or personne.prenom <> i.prenom);
     
    	insert into telephone (personne_id, type_telephone, numero_telephone)
    	select i.id, 'MAISON', i.telephone_maison from inserted i left outer join deleted d on d.id = i.id where d.telephone_maison is null and i.telephone_maison is not null
    	union
    	select i.id, 'MOBILE', i.telephone_mobile from inserted i left outer join deleted d on d.id = i.id where d.telephone_mobile is null and i.telephone_mobile is not null
    	union
    	select i.id, 'BOULOT', i.telephone_boulot from inserted i left outer join deleted d on d.id = i.id where d.telephone_boulot is null and i.telephone_boulot is not null;
     
    	update telephone
    	set numero_telephone = tmp.numero_telephone
    	from (
    		select i.id personne_id, 'MAISON' type_telephone, i.telephone_maison numero_telephone from inserted i inner join deleted d on d.id = i.id where d.telephone_maison <> i.telephone_maison
    		union
    		select i.id, 'MOBILE', i.telephone_mobile from inserted i inner join deleted d on d.id = i.id where d.telephone_mobile <> i.telephone_mobile
    		union
    		select i.id, 'BOULOT', i.telephone_boulot from inserted i inner join deleted d on d.id = i.id where d.telephone_boulot <> i.telephone_boulot
    	) tmp
    	where telephone.personne_id = tmp.personne_id and telephone.type_telephone = tmp.type_telephone;
     
    	delete telephone
    	from inserted
    	inner join deleted on deleted.id = inserted.id
    	where (deleted.telephone_maison is not null and inserted.telephone_maison is null and telephone.type_telephone = 'MAISON')
    	or (deleted.telephone_mobile is not null and inserted.telephone_mobile is null and telephone.type_telephone = 'MOBILE')
    	or (deleted.telephone_boulot is not null and inserted.telephone_boulot is null and telephone.type_telephone = 'BOULOT')
    end;
    go
     
    drop view contact_telephone;
    go
     
    create view contact_telephone (id, nom, prenom, type_telephone, numero_telephone)
    as
    with type_telephone (libelle)
    as
    (
    	select 'MAISON'
    	union all
    	select 'MOBILE'
    	union all
    	select 'BOULOT'
    )
    select p.id, p.nom, p.prenom, type_telephone.libelle, t.numero_telephone
    from personne p
    cross join type_telephone
    left outer join telephone t on t.personne_id = p.id and t.type_telephone = type_telephone.libelle;
     
    Et voilà ! Maintenant, le vieux programme travaille dans une jolie base bien modélisée sans même s'en rendre compte !
    On ne jouit bien que de ce qu’on partage.

  6. #6
    Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2015
    Messages : 5
    Points : 4
    Points
    4
    Par défaut Remerciements
    Merci beaucoup pour vos réponses, je vous tiens au courant si ça évolue.

  7. #7
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 152
    Points : 7 402
    Points
    7 402
    Billets dans le blog
    1
    Par défaut
    Voilà, j'ai mis au propre mon article, j'attends avec plaisir les commentaires

    http://www.developpez.net/forums/blo...-base-donnees/
    On ne jouit bien que de ce qu’on partage.

Discussions similaires

  1. [Admin] Erreur Fichier REP suite à un changement de la base de données
    Par BipBipBO dans le forum Administration-Migration
    Réponses: 4
    Dernier message: 13/05/2012, 21h11
  2. Notification et changement dans une base de données ?
    Par vincentDec dans le forum Silverlight
    Réponses: 1
    Dernier message: 30/04/2010, 22h10
  3. Détecter un changement dans une base de données
    Par phpeur dans le forum Langage
    Réponses: 10
    Dernier message: 19/04/2010, 11h52
  4. Changement de la base de données avec java
    Par ruby_robber dans le forum BIRT
    Réponses: 3
    Dernier message: 24/10/2007, 13h08
  5. changement d'une base de données
    Par ABN84 dans le forum Persistance des données
    Réponses: 3
    Dernier message: 10/10/2007, 14h14

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