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

Optimisations SGBD Discussion :

Gestion Abonnement - deux tables ou une ?


Sujet :

Optimisations SGBD

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2009
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 30
    Points : 21
    Points
    21
    Par défaut Gestion Abonnement - deux tables ou une ?
    Bonjour,

    J'ai une table membre et je souhaite qu'un membre puisse s'abonner à un ou plusieurs autres membres afin d'être au courant lorsque un d'eux poste un statut.

    Comme Twitter en gros.

    J’hésite entre deux possibilités.

    1 table membre avec un champ "abonnement"



    Dans le champ abonnement je mets tous les id_user des membres dont je suis abonné en les séparants par une virgule. Et je traite l'information avec un explode en php.

    Deuxième possibilité :

    Je fais une deuxième table avec une clé étrangère id_user, et je rajoute l'id du membre suivi.



    Exemple :
    A veut s'abonner à B et C
    C veut s'abonner à A
    B à C

    id_user...|..id_du_membre_suivi
    A...........|..B
    A...........|..C
    C...........|..A
    B...........|..C

    Si on a beaucoup de membre on risque d'avoir beaucoup de lignes...

    Quelle solution est la plus optimisée ?
    Je ne sais pas trop comment modéliser cette situation avec un MCD.
    Je dois faire une association réflective ?

    Merci de m'aider

    Bonne soirée

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 780
    Points
    30 780
    Par défaut
    C'est sans conteste la seconde solution qui est la seule bonne.
    L'autre ne devrait même pas être évoquée
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    je degagerai la colonne id_abonnement ceci dit.
    Elle ne sert à rien dans ce cas précis.

  4. #4
    Membre à l'essai
    Inscrit en
    Juin 2009
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 30
    Points : 21
    Points
    21
    Par défaut
    Merci al1 et punkoff pour vos réponses.

    Si j'enlève la colonne id_abonnement je mets quoi en clé primaire ? Sachant que je ne peux pas utiliser id_du_membre_suivi ou id_du_membre_abonné.

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 759
    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 759
    Points : 52 540
    Points
    52 540
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par punkoff Voir le message
    je degagerai la colonne id_abonnement ceci dit.
    Elle ne sert à rien dans ce cas précis.
    Pas si évident (dépend de l'indexation de la PK, par exemple CLUSTERED sous MS SQL Server=... Mais il est certain que dans ce cas, une clef alternative doit impérativement être rajouté sur le couple de clef étrangères.

    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/ * * * * *

  6. #6
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 147
    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 147
    Points : 7 392
    Points
    7 392
    Billets dans le blog
    1
    Par défaut
    Bonjour SQLPro, en quoi est-ce gênant que la clé primaire soit clustered ?

    En effet, lorsque je vais lire les abonnés de l'utilisateur lambda, ça me semble pas plus mal qu'ils soient tous regroupés ensemble sur le disque non ?

    Bon, après en effet, si 10000 personnes décident de s'abonner d'un coup à mon utilisateur 20, SQL Server va devoir bouger toutes les données de la table, ce qui peut être préjudiciable... Mais comparé au gain lors de toutes les autres requêtes, n'est-ce pas un risque à prendre ?
    On ne jouit bien que de ce qu’on partage.

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 759
    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 759
    Points : 52 540
    Points
    52 540
    Billets dans le blog
    5
    Par défaut
    Non seulement le problème que vous évoquez, mais une clef clustered sert de repère de ligne à tous les autres index ce qui fait que plus elle est grosse plus les index secondaires grossissent...

    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/ * * * * *

  8. #8
    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
    Revenons à la modélisation...

    Règle de gestion :
    Un membre peut s'abonner à plusieurs membres et un membre peut être dans les abonnements de plusieurs membres.

    MCD :
    membre -0,n----abonner
    |------------0,n---------|

    Tables :
    membre (mbr_id...)
    abonnement (abn_id_titulaire, abn_id_membre_cible)

    Même avec 100 000 membres qui ont en moyenne 10 abonnements, soit plus d'un million de lignes dans la table associative, en utilisant une clé de type entier auto-incrémenté pour mbr_id, et donc des entiers dans les clés étrangères, même le mauvais MySQL donnera la liste des membres auxquels un membre est abonné en une fraction de seconde.
    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 !

  9. #9
    Membre à l'essai
    Inscrit en
    Juin 2009
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 30
    Points : 21
    Points
    21
    Par défaut
    J'utilise Mysql.
    Du coup pas de clé primaire sur la table abonnement ?

    On m'a toujours dit qu'une table devait impérativement avoir une clé primaire afin d'éviter les doublons... :'|

  10. #10
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Si bien sûr, vous avez du lire un peu vite.

    Soit vous implémentez une colonne id_abonnement, qui sera votre clef primaire.
    Soit vous ne l'implémentez pas et vous déclarez votre couple (id_membre_abonné, id_membre_suivi) comme clef primaire.

  11. #11
    Membre à l'essai
    Inscrit en
    Juin 2009
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 30
    Points : 21
    Points
    21
    Par défaut
    D'accord! Merci à tous pour vos réponses.

    Juste une dernière question par rapport à ma table membre. C'est plus optimisé si je rajoute une table pour le sexe des membres ou je laisse comme tel ?


    Tables:
    membre (mbr_id...)
    genre(id_genre, homme, femme)

  12. #12
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 147
    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 147
    Points : 7 392
    Points
    7 392
    Billets dans le blog
    1
    Par défaut
    Ta table "genre" à 3 colonnes ???

    id_genre, lib_genre

    C'est mieux non ?

    Evite le type "bit" pour le sexe. Sans parler du mauvais jeu de mot, le problème de bit, c'est que c'est vrai/faux/null
    Un jour tu pourrais avoir besoin de rajouter un autre sexe, ce qui t'obligeras à casser toutes tes tables. Un tinyint sur 8 bits est donc tout à fait correct, d'autant que niveau représentation mémoire/traitements, ce sera plus rapide qu'un bit !
    On ne jouit bien que de ce qu’on partage.

  13. #13
    Membre à l'essai
    Inscrit en
    Juin 2009
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 30
    Points : 21
    Points
    21
    Par défaut
    StringBuilder pour récupérer le genre d'une personne je serai obligé de faire une jointure avec cette méthode. Le traitement sera plus long du coup ou ça ne change rien ?

  14. #14
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 147
    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 147
    Points : 7 392
    Points
    7 392
    Billets dans le blog
    1
    Par défaut
    Ca ne changera pour ainsi dire rien.
    La table "genre" sera minuscule, et sans mouvement. Elle sera donc continuellement en mémoire.

    Aussi, au lieu de faire une requête à chaque fois pour retrouver le sexe d'une personne, tu utiliseras une jointure, ce qui est beaucoup plus performant.
    On ne jouit bien que de ce qu’on partage.

  15. #15
    Membre expert
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2005
    Messages
    1 473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 473
    Points : 3 283
    Points
    3 283
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Non seulement le problème que vous évoquez, mais une clef clustered sert de repère de ligne à tous les autres index ce qui fait que plus elle est grosse plus les index secondaires grossissent...

    A +
    Dans SQL Server certes, mais pas dans la majorité des autres SGBD (et en tout cas sûrement pas dans DB2 for z/OS) où c'est une référence interne qui est stocké dans les index secondaires ...

  16. #16
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 759
    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 759
    Points : 52 540
    Points
    52 540
    Billets dans le blog
    5
    Par défaut
    Aujourd’hui"hui la plupart des SGBDR permettent de créer des index CLUSTERED. Dernier en date PostGreSQL.

    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/ * * * * *

  17. #17
    Membre éprouvé Avatar de Jester
    Inscrit en
    Septembre 2003
    Messages
    813
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 813
    Points : 1 058
    Points
    1 058
    Par défaut
    Intéressant, je ne l'ai pas vu. Sous quelle version et sous quelle syntaxe? On aura les index only scan dans la 9.2 (mais ça reste primitif) et l'opération cluster qui ne fait que trier la table sans lier à un index.

  18. #18
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 759
    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 759
    Points : 52 540
    Points
    52 540
    Billets dans le blog
    5
    Par défaut
    Pour PG, tout dépend du FILL FACTOR que vous allez mettre et de la fréquence a laquelle vous allez défragmenter ou reconstruire les index.

    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/ * * * * *

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


    Citation Envoyé par SQLpro Voir le message
    Aujourd’hui"hui la plupart des SGBDR permettent de créer des index CLUSTERED. Dernier en date PostGreSQL.
    C’était en quelle année ?


    Citation Envoyé par SQLpro Voir le message
    une clef clustered sert de repère de ligne à tous les autres index ce qui fait que plus elle est grosse plus les index secondaires grossissent...
    Le concept d’index cluster et la technique de « clusterisation » méritent d’être explicités, car les SGBD divergent à ce sujet. Par exemple, le problème que vous évoquez n’existe pas avec DB2, puisque dans son cas les index adressent tous directement les tables. Voir à ce propos les approches SQL Server et DB2 (lequel, pour mémoire, a permis la clusterisation dès le début, disons 1984).

    Parfois les divergences sont bigrement sensibles, et on risque de tomber carrément dans le quiproquo. Extrait du document Présentation du système d’information ORACLE et introduction à SQL, par ORACLE France SA, décembre 1986, page 65 :

    « Une autre technique pour l’amélioration des performances est la "clusterisation" (regroupement). En créant un "Cluster", vous demandez à ORACLE de juxtaposer physiquement ensemble des lignes en provenance de différentes tables. Cette technique accélère ainsi les requêtes de jointure car les lignes que vous êtes amené à rapprocher par l’opération de jointure sont déjà physiquement regroupées et stockées de manière consécutive dans une même page du disque. »

    Autrement dit, le cluster (commande CREATE CLUSTER) sert ici à implanter les jointures en dur. J’avoue qu’à l’époque cela m’avait laissé, disons, septique et dubitatif, quand j’ai comparé avec DB2. Pendant ce temps là, des collègues qui utilisaient SQL/DS (frère aîné de DB2, né en 1981) pleuraient à chaude larmes car ils ne bénéficiaient pas des index cluster de son petit frère...
    (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.

Discussions similaires

  1. [AJAX] Gestion de deux listes sur une même table
    Par kabkab dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 19/01/2008, 13h48
  2. Deux table en Une
    Par Poisson59 dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 24/08/2006, 15h40
  3. Deux table en Une
    Par Poisson59 dans le forum Requêtes
    Réponses: 3
    Dernier message: 23/08/2006, 16h31
  4. (Performance) Deux tables ou une seule?
    Par Norin dans le forum Access
    Réponses: 26
    Dernier message: 24/06/2006, 20h43
  5. Formulaire affichant deux tables liées à une troisième
    Par Mimi-des-îles dans le forum Access
    Réponses: 1
    Dernier message: 23/02/2006, 13h47

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