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 :

Modéliser un historique


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2015
    Messages : 10
    Points : 7
    Points
    7
    Par défaut Modéliser un historique
    bonjour j'ai une table A, (par exemple des personnes), j'ai une table B (des biens), il existe une relation 1 to Many entre B et A (un bien peut appartenir a une seule personne à la fois, mais une personne peut posseder plusieurs biens)

    sachant qu'un bien peut changer de propriétaire autant de fois que l'on veut,
    Quels choix feriez vous pour modéliser la db pour garder l'historique de tous les anciens propriétaires d'un bien (et tant qu'on y est avec les périodes qui correspondent)

    merci

  2. #2
    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
    bah... le classique

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    create table appartenance
    (
        id_personne int not null references personne(id),
        id_bien int not null references bien(id),
        debut date not null,
        fin date null,
        check (debut < fin or fin is null),
        primary key (id_personne, id_bien, debut),
        unique (id_personne, id_bien, fin)
    )

    Avec un petit trigger de validation pour les contraintes plus complexes :
    - Chevauchement de dates
    - Un même bien ne peut appartenir à deux personne en même temps (quoique ?)
    - Éventuellement fermeture automatique de la période en cours à la veille du début de la nouvelle période
    On ne jouit bien que de ce qu’on partage.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2015
    Messages : 10
    Points : 7
    Points
    7
    Par défaut merci
    eh bien un grand merci je débute donc ce n'était pas une évidence pour moi (d'ailleurs je n'ai pas encore vu les triggers)

  4. #4
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 541
    Points
    10 541
    Billets dans le blog
    21
    Par défaut
    Bonjour,

    Et si les périodes sont contiguës et ne se chevauchent pas, il n'est même pas utile de sauvegarder la date de fin, puisque la date de fin d'une période correspond alors à la date de début de la suivante
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    bonjour,

    Une alternative est de stocker une date de début, et une durée en nombre de jours

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 770
    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 770
    Points : 52 723
    Points
    52 723
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par François DORIN Voir le message
    Bonjour,

    Et si les périodes sont contiguës et ne se chevauchent pas, il n'est même pas utile de sauvegarder la date de fin, puisque la date de fin d'une période correspond alors à la date de début de la suivante
    Pas forcément, un bien peut être en "sans maître" ou en déshérence, par exemple décès sans héritier...

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

  7. #7
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 541
    Points
    10 541
    Billets dans le blog
    21
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Pas forcément, un bien peut être en "sans maître" ou en déshérence, par exemple décès sans héritier...
    Il y a quand même une hypothèse de départ que j'ai bien précisée : périodes contiguës Si un bien peut ne pas avoir de propriétaire, alors l'hypothèse de départ n'est pas vérifiée
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2015
    Messages : 10
    Points : 7
    Points
    7
    Par défaut .
    je comprend en théorie votre idée Mr Francois Dorin, mais on se complique la vie pour les requêtes SQL en faisant cela non ?

    occuper le moins de place possibles l'emporte-t-il toujours sur des choix plus confortables ?

  9. #9
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 541
    Points
    10 541
    Billets dans le blog
    21
    Par défaut
    Citation Envoyé par wakka369 Voir le message
    jmais on se complique la vie pour les requêtes SQL en faisant cela non ?
    Et non. On complique "certaines" requête SQL, mais on en simplifie d'autres :
    • cette utilisation "complique" les requêtes d'interrogation (et encore, avec une vue on retombe vite sur nos pieds) ;
    • cette utilisation simplifie les requêtes de mise à jour,d'insertion et de suppression de données, puisqu'une seule ligne sera impactée à chaque fois.


    Plus que de diminuer la taille de stockage des données, elle apporte une non redondance des informations et une cohérence des données qui est automatiquement garantie.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  10. #10
    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
    En fait, une table historique avec une seule date, c'est exactement la même chose qu'un acte notarié : en effet, sur une cession, un acte de propriété ou autre document, il y a toujours la date d'effet, et jamais (sauf rares cas) la date de fin. En effet, même pour un bail, la durée est fixe, mais la reconduction étant tacite, en absence de tout autre acte, son effet dure aussi longtemps que nécessaire.

    En revanche, pour la lecture c'est compliqué :
    - A qui appartient un bien à un instant T ? => au lieu de faire un simple "ladate between debut and fin" on est obligé de faire une sous-requête* pour identifier la date la plus grande inférieure ou égale à la date recherchée
    - Le bien B a appartenu à untel de quand à quand ? => idem, au lieu d'interroger une seule ligne, on va devoir se lancer à nouveau dans une sous-requête*

    * sous-requête ou auto-jointure, fonction de fenêtrage... en tout cas, on passe d'un index seek à, au mieux, un simple range scan, au pire, à de multiples lectures

    Sinon, pour en revenir à une autre suggestion, date + durée, personnellement, mise à part cas très particuliers, je n'en vois pas l'intérêt.
    => La durée, déjà, selon sa taille, on va vouloir utiliser différentes unités (heures, jours, mois, sciècles) sinon c'est illisible (27 ans, an jours, ça fait combien ? ah, oui, ça dépend à 100% de la date de départ... ou inversement, 12 jours, en année, ça fait combien ? ah, ça dépend de l'année...)

    Donc dans ce cas, même si la durée est une donnée qui est réellement utilisée, il me semble préférable de passer par une ou plusieurs colonnes calculées, ou une vue, qui expose la durée entre les deux dates exprimées en différentes unités.
    On ne jouit bien que de ce qu’on partage.

  11. #11
    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
    Citation Envoyé par François DORIN Voir le message
    Plus que de diminuer la taille de stockage des données, elle apporte une non redondance des informations et une cohérence des données qui est automatiquement garantie.
    Pas forcément.

    Si un bien n'est par exemple occupé que du 1er juin au 30 septembre tous les ans (maison de vacance par exemple) alors ta solution va nécessiter de créer des lignes bidon avec une personne "nulle" (ou "bidon", ce qui n'est guère mieux) qui va polluer la clé étrangère.
    Ceci devient d'autant plus problématique si ton historique est porteur de propriétés (loyer, nombre d'occupants, relevé eau, caution versée, etc.)
    On ne jouit bien que de ce qu’on partage.

  12. #12
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 541
    Points
    10 541
    Billets dans le blog
    21
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    Pas forcément.
    Même remarque qu'à SQLPro. J'ai bien précisé des hypothèses pour qu'une telle approche puisse être efficace. En l'occurrence, les périodes doivent être contiguës. L'exemple que tu donnes est clairement un cas où cette hypothèse n'est pas vérifiée
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  13. #13
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2015
    Messages : 10
    Points : 7
    Points
    7
    Par défaut .
    Citation Envoyé par StringBuilder Voir le message
    * sous-requête ou auto-jointure, fonction de fenêtrage... en tout cas, on passe d'un index seek à, au mieux, un simple range scan, au pire, à de multiples lectures
    Appart la sous-requete, je ne connais aucun autre terme de cette phrase, mais me voila avec de quoi chercher, merci pour vos réponses à tous

Discussions similaires

  1. [MCD] Comment modéliser un historique?
    Par Atchioum dans le forum Schéma
    Réponses: 10
    Dernier message: 15/03/2012, 19h08
  2. [MCD] Modélisation d'historique
    Par louroulou dans le forum Schéma
    Réponses: 2
    Dernier message: 12/08/2009, 20h29
  3. Réponses: 4
    Dernier message: 30/08/2007, 15h09
  4. [Modélisation] Gestion des dimensions historiques
    Par marchand_de_sable dans le forum Conception/Modélisation
    Réponses: 7
    Dernier message: 27/08/2007, 12h17
  5. [MCD] comment modéliser le fait qu'on veut garder un historique?
    Par zamoto dans le forum Schéma
    Réponses: 19
    Dernier message: 16/08/2006, 10h46

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