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 :

Design d'une base multi-user


Sujet :

Langage SQL

  1. #1
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut Design d'une base multi-user
    Hello, je me lance dans la base de données, c'est la fête!
    Je dois développer une BD servant à stocker des données. Ok.
    Ces données, dans mon prototype actuel, sont stockées dans une table, la table DATA. Ok.
    Un logiciel se connecte à la BD, et insère des données. Ok.
    L'objectif du jour : centraliser les données de plusieurs utilisateurs dans la même BD. Chaque utilisateur a son logiciel et son login, se connecte et remplit la base. Par défaut un utilisateur n'a pas à voir figurer d'autres données que les siennes, mais il doit y avoir une possibilité de partage.
    J'hésite entre 2 solutions:
    - j'ai d'abord pensé à simplement rajouter un champ "owner_id" dans la table DATA afin de savoir à qui appartient la donnée. Lorsqu'un utilisateur se connecte, le logiciel fait une jointure afin de récupérer ses données à lui. Le logiciel assure donc la sécurité des accès.
    - et je me suis dit que ça serait mieux que chaque utilisateur ait sa propre table : fini la jointure, et on peut sécuriser l'accès à chaque table au niveau de la BD. Ainsi, au lieu d'une seule table DATA, si j'ai 3 users, j'aurai 3 tables : user0_DATA, user1_DATA, user2_DATA.

    Qu'en pensez-vous ? Le gain provoqué par la jointure en moins sera-t-il réel ? Quelles-sont les bonnes pratiques dans ce type de cas ?

  2. #2
    Membre expérimenté
    Inscrit en
    Mars 2004
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 425
    Par défaut
    Si aujourd'hui t'a 3 users t'auras 3 tables et si le nombre de users augmente te voilà obligé de rentrer dans la BD créer de nouvelles tables et écrire de nouvelles procédures stockées.

    Perso je te conseille la première méthode avec les jointures.

    @++

  3. #3
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Après réflexion / recherche, ce que je cherche à faire semble tout simplement à créer une vue. Mais j'y connais pas grand chose, c'est possible de faire un truc de ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    CREATE VIEW MyData
    AS SELECT * FROM Data
    WHERE Data.owner_id=mon_id;
    ?

    Est-ce que l'admin peut créer cette vue générique et quand le user se connecte 'mon_id' est automatiquement le sien et ainsi chaque user utilise la vue MyData selon ce critère ? (je débute )

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 990
    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 990
    Billets dans le blog
    6
    Par défaut
    Non seulement c'est cela qu'il faut faire, mais ta vue sera UPDATABLE c'est à dire que tu peut insérer, suprimer et mettre à jour.

    Pense seulement à insérer systématiquement mon_id dans Data_owner.
    Cela peut être fait par trigger suivant le SGBDR que tu utilise.
    Par exemple avec MS SQL Server, pour insérer automatiquement l'utilisateur SQL dans une colonne par déclencheur, il suffit de lire la ligne du processus en cours dans la table système sysprocesses.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE TRIGGER D_INSERT_USER
    ON     MaTable
    FOR    INSERT, UPDATE
    AS
     
    UPDATE Data
    SET    Owner_id = (SELECT USER_NAME(uid)
                       FROM   master.sa.sysprocesses
                       WHERE  spid = @@spid)
    FROM   Data d
           INNER JOIN inserted i
                 ON d.Clef = i.Clef
    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/ * * * * *

  5. #5
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Ok merci bien.
    Je me demandais justement ce qui se passait si un petit curieux balance un requete où il insère une donnée avec un owner_id autre que le sien.
    Pour le trigger je sais pas trop. Je vise SqlServer en effet, mais pas seulement, et souhaite rester le plus indépendant possible. Je vise aussi à terme SQL Lite, Oracle, et peut etre PostGre ou MySQL.

    J'en reviens à la création de ma vue, je peux insérer une requête comme la tienne (SELECT USER_NAME(uid)...) dans la clause "WHERE Data.owner_id" de la création de ma vue ?

Discussions similaires

  1. Réponses: 8
    Dernier message: 11/02/2015, 10h31
  2. Problème avec une base multi-utilisateur
    Par Bispas dans le forum Access
    Réponses: 1
    Dernier message: 19/02/2012, 13h35
  3. [Entité-Association] Souci avec le design d'une base de données musicale
    Par dataweary dans le forum Schéma
    Réponses: 34
    Dernier message: 19/09/2011, 00h41
  4. Securite au sein d'une base multi-clients
    Par deudtens dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 21/08/2009, 11h22
  5. [URLRewriting] sur une configuration multi-users
    Par goldorax113 dans le forum Apache
    Réponses: 8
    Dernier message: 15/05/2007, 00h32

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