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

Modélisation Discussion :

Optimisation Base de données [AC-2007]


Sujet :

Modélisation

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 65
    Points : 23
    Points
    23
    Par défaut Optimisation Base de données
    Bonjour,

    Je suis un débutant sous Access, mais j'ai quelques notions en base de données.
    Je me retrouve confronté à une base de données sous Access 2007-2010 déjà existante (à peu près 2 000 lignes), mais à première vue pas vraiment bien conçue :

    Nom : old_schema.png
Affichages : 277
Taille : 14,7 Ko

    Quelques requêtes sont simples à faire puisque presque toutes les informations sont dans la même table, cependant par exemple pour savoir quels bureaux sont libres, je m'emmêle les pinceaux et au final je n'arrive à rien.
    Il me faut entre autres rajouter des informations , c'est pourquoi j'avais pensé à quelque chose ressemblant plutôt à cela avec des clés primaires "plus uniques" :

    Nom : new_schema.png
Affichages : 312
Taille : 23,9 Ko

    Cependant je ne suis pas sûr que ce soit une meilleure idée, et je me retrouve aussi face à un problème pour le changement de cette base, devrais-je faire un petit "script" qui parcourt la base de données source pour copier uns à uns les enregistrements dans la base de données destination ?


    Cordialement

  2. #2
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 65
    Points : 23
    Points
    23
    Par défaut Quelques détails
    Bonjour,

    Je me rend compte que je n'ai pas vraiment expliqué la base de données.

    Alors voilà l'idée c'est de gérer le personnel d'un département, pour cela j'ai besoin des personnes (leur nom/prénom/id et leurs droits) et des bureaux (qui sont décrits par un site, un bâtiment, un module, une pièce, un bureau, le numéro du socket, et son appartenance à un service).

    Ensuite, pour gérer correctement les requêtes liées à une personne j'ai besoin de références (PC,écrans,téléphone,badge,etc...)

    Enfin la table contrat qui est définie par une date de début, un type de contrat (intérim, employée,stagiaire,etc..),un fin prévue (pour les CDD,stagiaires, etc..), une personne, et éventuellement plusieurs bureaux.

    Le premier schéma correspond à l'ancienne base de données, c'est pour cela que toutes les informations supplémentaires n'y sont pas.

    En espérant avoir été plus clair

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonsoir,
    Personnellement je rajouterai un champ texte dans chaque table!

    J'updaterai ce champs avec la concaténation de clé [clé1] & '_' & [clé2] je supprimerai le clé j'ajouterai un auto incrément et en id secondaire! Enfin je rétablirai les liaisons entre la clé concaténée de l'enfant id id mère!

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 65
    Points : 23
    Points
    23
    Par défaut
    Bonjour,

    Merci de te pencher la dessus.

    Si je comprends bien, je devrais remplacer les clés primaires, par une concaténation des clés primaires comme Texte ?
    Donc je devrais updater la clé à chaque changement d'une partie de la clé primaire c'est bien ça ?

    Citation Envoyé par dysorthographie Voir le message
    Enfin je rétablirai les liaisons entre la clé concaténée de l'enfant id id mère!
    Tu parles des liaisons entre tables ?

    Cordialement

  5. #5
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 087
    Points : 5 203
    Points
    5 203
    Par défaut
    Bonjour,

    Le principal défaut de la base d'origine est son absence de clé primaire dans chaque table
    Ensuite il faut éviter de dupliquer les infos donc effectivement créer la table personnel, assets, contrats...
    Par contre il me semble qu'un utilisateur doit pouvoir avoir plusieurs assets il manque donc une table d'affectation qui fait le lien avec toutes les autres :
    - toto est affecté au contrat z du 1/1/16 au 31/12/99
    - toto utilise le PC 42
    - toto utilise le bureau xy
    - toto utilise le smartphone 123...

    Quand tout cela sera au point, le "petit script" sera une simple formalité
    Utilisez Planet, gestion d'entreprise gratuite pour TPE / PME

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 65
    Points : 23
    Points
    23
    Par défaut
    Bonjour nico84,

    Merci de ta réponse,

    Concernant la table Asset, il faudrait quelque chose comme la table LieuContrat ? En fait les assets sont donnés pour un poste donné, un employé n'aura pas le même écran à ses deux bureaux s'il en a deux, ni le même téléphone.

    Donc il faudrait que dans LieuContrat je rajoute un champ assetNumber ?

    De plus quand j'essaie d'appliquer l'intégrité référentielle à la relation entre Contrat et LieuContrat j'ai cette erreur : index unique introuvable pour le champ référence d'une table pricnipale


    Un autre soucis au niveau de la duplication, c'est que même dans ma deuxième base, j'ai la table Offices dans laquelle il y a par exemple 600 fois le même site, puis 200 fois chaque bâtiment, etc... Mais je ne sais pas comment régler ce problème, j'avais pensé à faire une table Site, avec un numéro et un nom, et faire de même pour les bâtiments/modules/pièces/desk mais je ne sais pas comment procéder.


    Cordialement

  7. #7
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 087
    Points : 5 203
    Points
    5 203
    Par défaut
    Citation Envoyé par Thenaar Voir le message
    Concernant la table Asset, il faudrait quelque chose comme la table LieuContrat ? En fait les assets sont donnés pour un poste donné, un employé n'aura pas le même écran à ses deux bureaux s'il en a deux, ni le même téléphone.

    Donc il faudrait que dans LieuContrat je rajoute un champ assetNumber ?
    Je ne connais pas les contraintes de l'application mais d'une manière générale je te conseille d'avoir :
    - une table pour chaque type d'objet
    - une table pour chaque type de lien entre les objets (lien qui peut être entre plus de 2 objets : utilisateur,contrat,bureau,pc...)

    Citation Envoyé par Thenaar Voir le message
    De plus quand j'essaie d'appliquer l'intégrité référentielle à la relation entre Contrat et LieuContrat j'ai cette erreur : index unique introuvable pour le champ référence d'une table pricnipale
    idwork n'est pas la PK de contrat ?
    Pour info, l'intégrité référentielle n'est pas nécessaire au bon fonctionnement de l'application et c'est souvent plus contraignant qu'autre chose...

    Citation Envoyé par Thenaar Voir le message
    Un autre soucis au niveau de la duplication, c'est que même dans ma deuxième base, j'ai la table Offices dans laquelle il y a par exemple 600 fois le même site, puis 200 fois chaque bâtiment, etc... Mais je ne sais pas comment régler ce problème
    avec un select distinct et un passage par excel pour controler les données avant import dans la nouvelle table
    Utilisez Planet, gestion d'entreprise gratuite pour TPE / PME

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 65
    Points : 23
    Points
    23
    Par défaut
    Merci nico84,

    En procédant comme tu dis, je me retrouve avec quelque chose du genre :

    Nom : schema.png
Affichages : 237
Taille : 32,6 Ko

    Devrais-je fusionner les tables Occupe et Travaille ?
    Je ne suis pas certain de comment gérer la table ContractType, ça m'embête de faire 2 tables, une pour le type et une pour la relation avec Contrat pour seulement une information, c'est pas un peu trop ?

    Citation Envoyé par nico84 Voir le message
    Citation Envoyé par Thenaar Voir le message
    Un autre soucis au niveau de la duplication, c'est que même dans ma deuxième base, j'ai la table Offices dans laquelle il y a par exemple 600 fois le même site, puis 200 fois chaque bâtiment, etc... Mais je ne sais pas comment régler ce problème
    avec un select distinct et un passage par excel pour controler les données avant import dans la nouvelle table
    Pour le moment dans ma nouvelle table Office, j'ai exactement les mêmes données que dans la table d'origine, avec les mêmes duplications de site/building/etc..
    Vu que normalement il n'y aura pas d'opérations de mise à jour (pas de changement de nom de site ou de bâtiment) est-ce grave ?

    Pour plus de clarté voilà un aperçu de la table Offices :


    Nom : table_office.png
Affichages : 230
Taille : 71,8 Ko

    Je crois avoir besoin de toutes les colonnes pour définir un bureau.

    Cordialement

  9. #9
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 087
    Points : 5 203
    Points
    5 203
    Par défaut
    Citation Envoyé par Thenaar Voir le message
    Pour le moment dans ma nouvelle table Office, j'ai exactement les mêmes données que dans la table d'origine, avec les mêmes duplications de site/building/etc..
    Vu que normalement il n'y aura pas d'opérations de mise à jour (pas de changement de nom de site ou de bâtiment) est-ce grave ?
    Si "BLAGNAC CAMPUS 1" est une clé primaire acceptable et si son adresse (ou d'autres paramètres du site) n'a pas besoin d'être renseignée c'est pas joli mais fonctionnel
    Utilisez Planet, gestion d'entreprise gratuite pour TPE / PME

  10. #10
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 65
    Points : 23
    Points
    23
    Par défaut
    Citation Envoyé par nico84 Voir le message
    Si "BLAGNAC CAMPUS 1" est une clé primaire acceptable et si son adresse (ou d'autres paramètres du site) n'a pas besoin d'être renseignée c'est pas joli mais fonctionnel
    En fait la clé primaire d'un bureau c'est lu numéro automatique qui lui est attribué, pour en créer un il faut le Site, le Bâtiment, le Module, la Pièce et le Bureau.
    Le champ Site n'est pas une clé primaire à lui seul.

  11. #11
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 65
    Points : 23
    Points
    23
    Par défaut Script de transfert
    Bonjour,

    Au final j'ai opté pour quelque chose de moins complexe que prévu, je me retrouve donc à devoir faire un script de transfert entre les deux bases.

    J'arrive correctement à récupérer, réagencer mes données. Les premières requêtes d'insertion se passent bien, mais au bout de quelques enregistrements ajoutés voilà l'erreur à laquelle je suis confronté :

    Nom : ErreurAccess2.png
Affichages : 212
Taille : 10,9 Ko


    J'ai remarqué que le fichier .laccdb lié à la table source destination augmente de taille jusqu'à 4Ko, puis l'erreur apparaît, ensuite le fichier ne disparaît pas.

    Pourrait-ce être lié à la connexion ? Si je ne fais pas correctement le OleDbConnection.close() ?

    Voici la fonction que j'utilise pour faire les requêtes :

    Code : 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
     
    Public Shared Function Request2(ByVal req As String) As OleDbDataReader
            Console.WriteLine("[ACCESS_REQUEST] : {0}", req)
            Dim conn As New System.Data.OleDb.OleDbConnection()
            conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=...."
            Dim maCommande As OleDbCommand
            Dim custReader As OleDbDataReader
            conn.Close()
            Try
                conn.Open()
                maCommande = New OleDbCommand(req, conn)
                custReader = maCommande.ExecuteReader(CommandBehavior.CloseConnection)
                Return custReader
            Catch ex As Exception
                MessageBox.Show("Error in the RequestAccess() function : " & ex.Message)
            End Try
     
            Return Nothing
        End Function

    J'ai essayé de mettre le conn.close() dans un Finally mais ensuite je n'avais rien dans le reader renvoyé, je l'ai donc mis au début dans l'espoir de fermer le précédent, j'imagine cependant que cela ne marche pas.


    Cordialement

  12. #12
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 087
    Points : 5 203
    Points
    5 203
    Par défaut
    J'avoue ne pas utiliser ce type de syntaxe

    Pour accéder à une base access qui n'est pas dans mon projet, j'utilise OpenDatabase (une fois pour toutes) et ensuite je lis les tables dont j'ai besoin

    Par ailleurs pour ce type de code qui n'est pas destiné à un utilisateur je suis en mode debug (le code VBA s'arrête à la 1e erreur pour voir ce qui se passe)
    Utilisez Planet, gestion d'entreprise gratuite pour TPE / PME

  13. #13
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 65
    Points : 23
    Points
    23
    Par défaut
    Il faudrait donc que j'ouvre une connexion avec openDatabase() puis écrire ce que je désire, puis fermer la connexion ?

    Je vais voir ça

  14. #14
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 65
    Points : 23
    Points
    23
    Par défaut
    C'est peut-être une question bête, mais j'ai trouvé très peu d'exemples sur le net de openDatabase(). Comment se passent les requêtes ensuite ? On les exécute de la même manière ?

    Cordialement

  15. #15
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 087
    Points : 5 203
    Points
    5 203
    Par défaut
    Avec la syntaxe que j'utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim wrk As DAO.WorkSpace, odb As DAO.Database
    Set wrk = DBEngine.Workspaces(0)
    Set odb = wrk.OpenDatabase(mabase, False, False, "MS Access;PWD=" & monpwd)
    Ensuite c'est comme d'habitude sauf que odb remplace currentdb :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Set rst = odb.OpenRecordset(marequete)
    ou
    odb.execute marequete, dbfailonerror
    Utilisez Planet, gestion d'entreprise gratuite pour TPE / PME

  16. #16
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 65
    Points : 23
    Points
    23
    Par défaut
    Merci pour le conseil, mais en m'aventurant un peu j'ai l'impression que DAO n'est pas exceptionnel, même avec les imports et les DLL nécessaires ça n'a pas l'air de marcher. Je pense que je vais me tourner vers ADO.NET

  17. #17
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 65
    Points : 23
    Points
    23
    Par défaut
    Bonjour,

    J'ai finalement décidé de ne pas changer la base de données, la base de départ pouvait convenir.

    Je vous remercie de votre aide.

    Cordialement.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Optimisation base de données SQL Server 2000: Indexation
    Par Mouckson dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 22/05/2012, 01h39
  2. Optimisation base de données
    Par denis13 dans le forum Requêtes
    Réponses: 13
    Dernier message: 30/09/2011, 10h01
  3. Optimisation base de données
    Par nathann dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 14/04/2010, 16h47
  4. outils de optimisation base de donnée
    Par simomig29 dans le forum Outils
    Réponses: 5
    Dernier message: 12/02/2008, 08h35
  5. Optimisation base de données?
    Par Guizmo95 dans le forum Requêtes
    Réponses: 3
    Dernier message: 02/11/2006, 15h56

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