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

Langage SQL Discussion :

Problème de conception


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Inscrit en
    Juin 2006
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 58
    Points : 50
    Points
    50
    Par défaut Problème de conception
    Bonjour,

    je suis débutant en base de données et je me pose une question :
    dans mon application je vais avoir des milliers d'utilisateurs et des milliers de lignes de données par utilisateur que je vais stocker dans une base. Est-ce que créer une table par utilisateur présente un intérêt (en performance) par rapport à la création d'une table globale dans laquelle chaque ligne de données contient l'id de l'utilisateur ?
    (les ensembles [utilisateur+ ses lignes de données] sont indépendants).

    Merci beaucoup !

  2. #2
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 102
    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 102
    Points : 31 545
    Points
    31 545
    Billets dans le blog
    16
    Par défaut
    Bonjour,


    Est-ce que créer une table par utilisateur présente un intérêt (en performance) par rapport à la création d'une table globale dans laquelle chaque ligne de données contient l'id de l'utilisateur ?
    Si vous aviez 300 millions d'utilisateurs, créeriez-vous autant de tables ? Certes non. En plus si vous créiez une table pour chacun de vos milliers d'utilisateurs, comment feriez-vous par exemple pour rechercher tous ceux qui sont localisés dans telle ville ? Vous iriez explorer chaque table ?

    Vous créerez plutôt une table unique appelée Utilisateur, qui contiendra une ligne par utilisateur et pour savoir quels sont ceux qui, par exemple, habitent Marseille, vous utilisez une requête du genre :

    Select NomUtilisateur
    From Utilisateur
    Where Ville = 'Marseille'

    La performance dépendra des index mis en place.

  3. #3
    Membre du Club
    Inscrit en
    Juin 2006
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 58
    Points : 50
    Points
    50
    Par défaut
    Merci pour ce commentaire, mais je vais un peu préciser mon problème pour être sûr de bien comprendre votre réponse.

    Prenons un exemple fantaisiste et sans intérêt :
    imaginons un système qui permet d'enregistrer l'historique des pages visitées pour chaque utilisateur d'un site internet, avec une forte fréquentation.

    je vois deux optiques :
    - créer une table users dans laquelle on stocke les informations générales sur les utilisateurs et une table historique dans laquelle on stocke l'url de toutes les pages visitées pour tous les utilisateurs.

    - créer une table user qui contient les mêmes informations et autant de tables d'historique qu'il y a d'utilisateurs, en sachant pertinemment que la recherche se limitera à un et un seul utilisateur particulier.

    Dans le cas où j'ai des millions d'enregistrements, est-ce que le fait de séparer les historiques des utilisateurs dans des tables différentes amène un gain de performance ?

    Merci.

  4. #4
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 102
    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 102
    Points : 31 545
    Points
    31 545
    Billets dans le blog
    16
    Par défaut
    Citation Envoyé par grob1212
    créer une table users dans laquelle on stocke les informations générales sur les utilisateurs et une table historique dans laquelle on stocke l'url de toutes les pages visitées pour tous les utilisateurs.
    Imaginons le système de tables :
    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
    TABLE Utilisateur
    ( UtilisateurId   Integer       Not Null,
     Pseudo           Varchar(16)   Not Null,
     AdrCourriel      Varchar(48)   Not Null,
     ...
     PRIMARY KEY (UtilisateurId) ...) ;
     
    TABLE HISTORIQUE
    ( UtilisateurId   Integer       Not Null,
      VisiteId        Integer       Not Null,
      DateVisite      Date          Not Null,
      UrlVisite       Varchar(255)  Not Null, 
     ...
     PRIMARY KEY (UtilisateurId, VisiteId)
     FOREIGN KEY (UtilisateurId) References Utilisateur ...) ;
    Sur la table Utilisateur sera connecté au moins un index pour l’attribut UtilisateurId, voire un autre sur l’attribut Pseudo, etc., en fonction des besoins. En tout état de cause, l’accès à un utilisateur donné est très rapide. Par exemple, avec DB2 for z/OS, pour retrouver l’adresse de courriel de l’utilisateur 1024 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT  AdrCourriel
    FROM    Utilisateur
    WHERE   UtilisateurId = 1024 ;
    Et en supposant que la table Utilisateur contienne cent mille utilisateurs, au cas où la donnée n’est pas déjà en mémoire, DB2 lira deux pages de l’index branché sur l’attribut UtilisateurId plus la page de données de la table elle-même, ce qui à quelques millisecondes la lecture est économique. Si la table contient 30 millions d’utilisateurs, il y aura 1 page index de plus à lire, autant dire peanut. Et puis vous pouvez réduire le nombre de niveau d’index grâce à la technique du partitionnement (si votre SGBD le permet).

    Concernant la table Historique, les chiffres sont à peu près du même ordre de grandeur, sinon que la clé ayant une taille double de celle de la table Utilisateur, pour 30 millions de lignes il faudra compter 4 pages index à lire au lieu de 3, ce qui n’est toujours pas grand-chose.

    Citation Envoyé par grob1212
    créer une table user qui contient les mêmes informations et autant de tables d'historique qu'il y a d'utilisateurs, en sachant pertinemment que la recherche se limitera à un et un seul utilisateur particulier
    Au vu de ce qui précède, le gain en performance sera imperceptible.
    Sachant qu’un jour vous éprouverez le besoin de croiser les données, avec ce deuxième scénario vous serez coincé.
    En plus, à chaque fois que vous aurez un nouvel utilisateur, vous devrez en passer par la création d’une nouvelle table historique et des index à brancher, la supprimer quand vous supprimez un utilisateur : beaucoup de travail en perspective, pour rien.

  5. #5
    Membre du Club
    Inscrit en
    Juin 2006
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 58
    Points : 50
    Points
    50
    Par défaut
    Merci beaucoup pour ces explications, c'est très clair maintenant. Je ne connaissais pour ainsi dire pas les index, ca va me permettre de mieux penser mes bases de données.

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

Discussions similaires

  1. Méthode Finalize et problème de conception
    Par phryos dans le forum Langage
    Réponses: 4
    Dernier message: 19/04/2006, 11h04
  2. [VB6][UserControl et OCX]Problème de conception
    Par jacma dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 19/01/2006, 22h37
  3. Petit problème de conception sur access
    Par coooookinette dans le forum Modélisation
    Réponses: 3
    Dernier message: 18/12/2005, 18h24
  4. Gestion des départements problème de conception
    Par snoopy69 dans le forum Modélisation
    Réponses: 7
    Dernier message: 11/10/2005, 13h08
  5. Problème de conceptions de tables
    Par dtavan dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 23/05/2004, 23h13

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