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

Entity Framework Discussion :

Intérêt de gérer les relations entre tables dans la base SQL (clés étrangères)


Sujet :

Entity Framework

  1. #1
    Membre à l'essai
    Homme Profil pro
    IT & ERP Project Manager - Consultant
    Inscrit en
    Octobre 2017
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : IT & ERP Project Manager - Consultant

    Informations forums :
    Inscription : Octobre 2017
    Messages : 32
    Points : 16
    Points
    16
    Par défaut Intérêt de gérer les relations entre tables dans la base SQL (clés étrangères)
    Bonjour à tous,

    Je travaille sur une DB contenant actuellement une 50aine de tables et qui risque encore d'évoluer au fil du temps. (Il s'agit d'une base SQL Server Express (pour le développement mais qui sera migrée en "pro" en production; et j'utilise EF 6)

    Il s'agit d'un logiciel ERP gérant, entre autres, les flux commerciaux d'une entreprise ainsi que la gestion du stock.

    Je vais décrire un exemple pour illustrer ma question :

    Une table "Entête de commande" (CMD) avec une clé primaire composée d'un préfixe et un numéro de commande.
    Une table "Détails de commande" (CMDA) avec une clé primaire composée d'un préfixe, d'un numéro de commande, et d'un numéro de ligne. (il y a donc un lien "one to many" entre l'entête et le détails; avec possibilité de ne pas avoir de détail)
    Une table "sous détail de commande" (CMDAB) avec une clé primaire composée d'un préfixe, d'un numéro de commande, d'un numéro de ligne, et d'un "item" de sous-détail. (avec un lien "one to many" entre le détail et le sous-détail et la possibilité de ne pas avoir de sous détail)
    Une table "Customer" avec une clé primaire composée d'un champ "ID_CUSTOMER" (liée à la table entête de commande par 3 champs : (CMD.CLIENT_ID, CMD.CLIENT_FAC_ID, CMD.CLIENT_EXP_ID car la commande peut être lié à un client mais avoir des informations de livraisons liées à un autre client, idem pour la facturation).

    Sur le même schéma, j'ai 3 tables pour lier les expéditions avec un lien entre les lignes de détails de mes expéditions et des lignes de détails de commande. (1 ligne de commande pouvant être liée à plusieurs lignes d'expédition)

    Chaque ligne de détail ou de sous détails comportent un champ "PRODUCT_ID" qui les lie à une table "PRODUCT" reprenant les produits vendus ou achetés.

    ...

    (Il existe encore plusieurs autres types de lien)

    Les indexes et clés primaires sont configurés pour chaque table mais je n'ai créé aucun diagramme relationnel dans SQL Server Management Studio; donc actuellement les seuls liens existants se trouvent dans ma petite tête.

    J'aurais aimé savoir s'il était intéressant de créer ce diagramme et de définir toutes les relations entre les différentes tables avant de générer mon modèle EF dans Visual Studio ? J'ai beau chercher je n'ai pas trouvé l'information et je souhaite structurer un maximum mon travail. (Je m'occupe seul de la DB mais d'autres développeurs me rejoignent pour le reste du travail)

    La finalité est de travailler avec un MVVM (.NET, C#)

    Merci d'avance pour vos retours

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    bonjour,
    Il y a deux avantages à créer tes foreign key dans la base de données
    a/Si quelqu'un pour des raisons de maintenance fait un update direct de la base de données, il ne pourra pas rompre ton modèle.
    b/Selon comment tu crées ton modèles entity framework, tu peux le récupérer depuis la base de données. En database first il est beaucoup plus pratique que le modèle soit juste avant de le genérer dans entity framework, sinon c'est la galère. En code first, il existe des outils pour générer le modèle entity à partir de la base.

    PS: Tu peux créer tes foreign key sans créer de schema visuel dans SQL server.

    Cordialement
    Soazig

  3. #3
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 154
    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 154
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Bonjour Li0303,

    En effet, créer les clé étrangères est un réel plus, car cela permet d'éviter de se retrouer avec des lignes orphelines.

    Cela permet aussi de grandement améliorer les performances lors des requêtages suivant ces jointures.

    Autre point, qui n'a pas grand chose à avoir, mais un peu quand même : actuellement, tu utilises des clés primaires composées.
    Je te conseille grandement de respecter la règle de Codd qui consiste à ce qu'une clé soit technique et dénuée de sens... et unitaire.

    Ainsi, que ce soit les clients, commandes, lignes de commande, détails de commandes, factures et livraisons, je te conseille :
    - De leur mettre une clé primaire en int ou bigint, autoincrémentée : les index seront bien plus petits, et donc plus performants
    - De se service de cette clé pour créer tes relations entre tables : les jointures seront plus aisées à écrires, avec la garantie de bien suivre les relations sans sauter par dessus (par exemple jointure entre CMD et CMDAB sur uniquement le numéro de commande, qui serait contre-performant)
    - De mettre tes clés actuelles sous forme de clés alternatives (contraintes uniques) afin que pouvoir travailler exclusivement sur les index lors du filtrage par ces numéros
    - De ne pas répéter les éléments de clés dans les sous-table : une ligne de détail de commande ne doit pas contenir ni l'ID interne de la commande, ni son numéro, uniquement l'ID interne de la ligne de commande à laquelle il se rapport ainsi que le numéro d'item, avec une clé unique sur (CMDAB.CMDA_ID, CMDAB.ITEM_ID)

    En effet, même si lors des SELECT ça va obliger à consulter les tables CMD et CMDA pour retrouver le numéro de commande lorsque tu travailles sur CMDAB afin d'afficher ton identifiant actuel (l'identifiant applicatif), cela sera plus performant. SQL Server ne travaillera de toute façon que sur les index, pas sur les tables elles-mêmes, qui seront plus petite car moins redondantes.

    Un autre avantage, c'est que si le préfixe d'une commande change (erreur de saisie + correction) tu n'as besoin de modifier que l'entête, pas les lignes et le détail... et qui sait quoi d'autre à l'avenir.

    Il en résultera une application bien plus facile à maintenir et faire évoluer.
    On ne jouit bien que de ce qu’on partage.

  4. #4
    Membre éprouvé Avatar de star
    Homme Profil pro
    .
    Inscrit en
    Février 2004
    Messages
    842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Corée Du Nord

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Février 2004
    Messages : 842
    Points : 983
    Points
    983
    Par défaut
    Un peu de théorie sur les Formes normales : https://fr.wikipedia.org/wiki/Forme_normale_(bases_de_données_relationnelles)

    Un peu d'histoire sur le modèle de données relationnel qui a été défini en 1970 par l'informaticien britannique d'IBM Edgar F. Codd : https://fr.wikipedia.org/wiki/Base_d..._relationnelle
    .
    Diviser c'est régner : United we stand, Divided we fall
    .

  5. #5
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Depuis 2017, j'espere que l'OP a quand meme reussi a se documenter
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Désolée pour le déterrage de topic, je n'avais pas fait attention à la date.
    Oups.

  7. #7
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 154
    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 154
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Rho ben c'est malin, et moi qui raconte un roman en plus
    On ne jouit bien que de ce qu’on partage.

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    A ma décharge, on était quand même sur la première page, je ne suis pas aller chercher le 50 eme post.
    Mais c'est un forum très peu actif.
    Encore désolée.
    Soazig

Discussions similaires

  1. Besoin de précision avec les relations entre Tables
    Par johnvox dans le forum Outils
    Réponses: 10
    Dernier message: 17/12/2008, 17h45
  2. Obtenir les relations entre tables
    Par jdmbh dans le forum Développement
    Réponses: 1
    Dernier message: 29/09/2008, 10h47
  3. [MySQL] mysql et les relations entre tables
    Par aquafafa dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 06/12/2007, 11h20
  4. Relation entre tables dans bdd différentes
    Par Mandotnet dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 29/03/2006, 08h03
  5. Les relations entre tables
    Par sheira dans le forum MS SQL Server
    Réponses: 11
    Dernier message: 20/03/2006, 15h03

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