|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 668 ![]() |
Bonjour,
J'ai un problème de modélisation, et il faut savoir que j'utilise SQL Server, qui ne permet pas (mais est-ce un mal) la déférrabilité des contraintes de clé étrangère. J'ai donc une entité document, avec quelques attributs, et notamment un que nous avons nommé derniere_document_version_id. Tout document a une dernière version. D'autre part j'ai une entité document_version, donc les attributs sont, entre autres, document_id (référence l'entité document), version_major et version_minor. Évidemment une version de document correspond obligatoirement à un document. Cela donne les tables suivantes : Code :
![]() Donc je ne peux pas ajouter de lignes dans les tables correspondantes. Je pensais donc rendre les colonnes : - document_id de la table document_version, - latest_document_version_id de la table document NULLable - gérer l'insertion à l'aide d'une transaction Les autre possibilités m'ont l'air assez crades : - supprimer la colonne derniere_document_version_id, et ajouter une colonne de type bit à la table document_version pour marquer une version comme étant la dernière ... - supprimer la colonne derniere_document_version_id créer une vue indexée pour effectuer le calcul. Dans les deux cas ce sera plus coûteux que la transaction. J'aimerais avoir votre avis là-dessus. Merci ! @++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes. Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012 |
||
|
00
|
|
|
#2 | ||||||||||||
|
Expert Confirmé Sénior
![]() ![]() ![]() Spécialiste en bases de données Inscription : septembre 2006 Messages : 2 882 ![]() |
Bonsoir,
Côté modélisation, c’est évidemment affreux et vous en subissez les conséquences... En théorie, les versions ne figurent que dans la table DOCUMENT_VERSION et récupérer la dernière d’entre elles est alors un jeu d’enfant pour quelqu’un de votre calibre. Si malgré tout, on tient (lubie de l’autorité ?) à faire figurer cette dernière version dans la table DOCUMENT, on peut le faire, mais sans redondance, c'est-à-dire en l’expulsant de la table DOCUMENT_VERSION qui devient en quelque sorte un historique (donc avec gestion de dates de début et de fin et tout le toutim, au moins dans l’exemple). Exemple (SQL Server 2005), (permettez-moi au passage de remplacer UNIQUEIDENTIFIER par CHAR(04)... Code SQL :
Code SQL :
Code SQL :
Code SQL :
Avec une vue d’union (pardon pour les CONVERT SQL Server) : Code SQL :
=> Code :
__________________
_ Faites simple, mais pas plus simple ! (A. Einstein) 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 (Bonne lecture !) |
||||||||||||
|
|
10
|
|
|
#3 | ||||
|
Membre Expert
![]() Inscription : mars 2005 Messages : 1 565 ![]() |
Bonjour fsmrel,
La modélisation que vous proposez est-elle juste faite pour éviter le NULL dans VersionDurantFin ? Sinon quelle différence avec : Code :
Code :
Et enfin question pour Elsuket, pourquoi écarter la solution de la vue indexée pour maintenir une colonne de la dernière version par rapport à une solution basée sur une transaction ? |
||||
|
|
00
|
|
|
#4 | ||
![]() ![]() |
Effectivement gérer la dernière version dans une vue me paraît le plus propre !
Sinon autre solution pas super (j'ai rajouté un datetime dans document_version) : Code :
__________________
Email : http://scr.im/waldar |
||
|
00
|
|
|
#5 | ||
|
Expert Confirmé Sénior
![]() ![]() ![]() Spécialiste en bases de données Inscription : septembre 2006 Messages : 2 882 ![]() |
Bonjour,
C’est un plaisir de vous revoir, vmolines du pays du soleil. Citation:
Citation:
Cela dit, mon objet était seulement d’aborder le thème de l’historisation des données telle qu'elle doit être pratiquée dans les règles de l’art. Mais évidemment, dans cette histoire le bonhomme NULL est d’office éjecté, sans même que l’on ait à parler de lui. Le principe de base est, d’une part de séparer les données « mortes » des données « vives » (décomposition horizontale), et d’autre part de séparer les données mises à jour à des dates qui leurs sont propres (décomposition verticale). Tout est décrit en 400 pages dans un ouvrage dédié aux données temporelles Temporal Data and the Relational Model dû à Lorentzos, Date et Darwen. On en retrouve un concentré dans le chapitre 23, «Temporal Databases» de An Introduction to Database Systems, 8th edition. Si vous voulez un avant-goût, voyez le support de cours de Darwen.
__________________
_ Faites simple, mais pas plus simple ! (A. Einstein) 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 (Bonne lecture !) |
||
|
|
10
|
|
|
#6 |
|
Membre Expert
![]() Inscription : mars 2005 Messages : 1 565 ![]() |
Encore une fois j'ai lu trop vite et la réponse que j'attendais était effectivement déjà là
.Merci pour les références concernant l'historisation des données car c'est une problématique récurrente sur laquelle je me sens encore très léger. edit : ah mais je reconnais cet extrait, il est imprimé chez moi et j'avoue qu'il m'a fait mal à ma première (et dernière) lecture. Bon, il faudra que je m'y replonge .
|
|
|
00
|
|
|
#7 | |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 953 ![]() |
Citation:
http://sql-info.de/sql-notes/develop...ns-in-sql.html A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
|
|
00
|
|
|
#8 | |
|
Membre Expert
![]() |
Citation:
traitement sur les INSERT/UPDATE/DELETE de version qu'une historisation. Bien sûr le principe de l'historisation est tout à fait valable également, je n'expose que ma sensibilité
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir. |
|
|
|
00
|
|
|
#9 | |
|
Expert Confirmé Sénior
![]() ![]() ![]() Spécialiste en bases de données Inscription : septembre 2006 Messages : 2 882 ![]() |
Bonjour,
Citation:
Pour mémoire, parmi les principales erreurs relevées : — Mise en œuvre d’attributs cachés, entraînant le viol du Principe de l’information : les objets mis en œuvre ne sont pas relationnels (voir le paragraphe « Consequences of Hidden Columns » dans l’article que j’ai cité).Cela dit, tant qu’à fournir des références, allons-y. En l’occurrence, je pioche dans DBPD (Database Programming & Design) revue malheureusement avalée fin 1998 par Intelligent Enterprise (et dont le dernier numéro est daté d’octobre 1998). Voici ce qu’a écrit Jim Melton en novembre 1995 (Database Programming & Design, Volume 8 - Number 11), dans son article « A Flurry of Activity in the SQL Standards World » : Long-time users of SQL in business applications (and not a few scientific ones, too!) are painfully aware that SQL's ability to handle time-series data and the like is ... well, let's just say that it's not exactly breathtaking.J’aime bien les commentaires savoureux de Ed Dee, Database Languages Rapporteur Group, British Standards Institution (cf. Database Programming & Design (Volume 9 - Number 5), dans sa réponse « U.K. SQL standards group speaks up » datée de mai 1996) : DEAR EDITORPour être complet, voici les commentaires de Jim Melton accompagnant la réponse d’Ed Dee dans le même numéro de DBPD : Contributing editor Jim Melton replies:=> Comme le temps passe... Aujourd’hui, Anne, ma sœur Anne, ne vois-tu rien venir ? (Et pendant ce temps, Malbrough ne revient toujours pas...)
__________________
_ Faites simple, mais pas plus simple ! (A. Einstein) 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 (Bonne lecture !) |
|
|
|
20
|
|
|
#10 |
|
Invité de passage
![]() Consultant en Business Intelligence Inscription : mai 2011 Messages : 5 ![]() |
Ma préférence va pour la solution "supprimer la colonne derniere_document_version_id, et ajouter une colonne de type bit à la table document_version pour marquer une version comme étant la dernière ...". C'est une solution simple et elle te permet de normaliser ton modèle.
|
|
|
00
|
|
|
#11 | |
|
Expert Confirmé Sénior
![]() ![]() ![]() Spécialiste en bases de données Inscription : septembre 2006 Messages : 2 882 ![]() |
Citation:
En l’état, la table DOCUMENT proposée par elsuket respecte la sixième forme normale, tandis que sa table DOCUMENT_VERSION ne respecte « que » la cinquième forme normale. La solution qui a votre préférence n’apporterait donc d’amélioration au plan de la normalisation que si la table DOCUMENT_VERSION respectait dorénavant elle aussi la sixième forme normale, ce qui n’est pas le cas.
__________________
_ Faites simple, mais pas plus simple ! (A. Einstein) 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 (Bonne lecture !) |
|
|
|
00
|
|
|
#12 |
|
Invité de passage
![]() Consultant en Business Intelligence Inscription : mai 2011 Messages : 5 ![]() |
Je suis d'accord avec toi mais je précise 2 choses :
- la solution que j'ai choisi est normalisée si on la compare par rapport à la situtation initial du modèle (pas par rapport aux autres solutions proposées); - cette solution respecte la 3eme forme normale (qui est souvent le standard en entreprise) et je la trouve très simple. Hors discussion : Pour moi qui pensait que Merise et ses adeptes étaient morts, je suis agréablement surpris de voir des personnes visant la dernière forme normale. C'est une chance que de vous avoir sur ce forum.
|
|
|
01
|
|
|
#13 | |
|
Expert Confirmé Sénior
![]() ![]() ![]() Spécialiste en bases de données Inscription : septembre 2006 Messages : 2 882 ![]() |
Bonjour,
Citation:
La solution initiale ainsi que la vôtre respectent la cinquième forme normale (et la sixième pour partie), donc la troisième. Il n’y a pas de standard en entreprise sur le sujet, sinon des affirmations gratuites déjà formulées il y a au moins trente ans par de prétendus experts n’ayant étudié ni la forme normale de Boyce-Codd, ni a fortiori la quatrième et la cinquième forme normales, ou, variante (notamment le 2e exemple), ayant compris le sujet de travers et ce dès la première forme normale. Je ne suis manifestement pas mort et je ne suis pas un adepte de Merise, mais seulement du Modèle Relationnel de Données. Pour que les choses soient claires, j’en rappelle la définition : Le Modèle Relationnel de Données (qui relève de la logique et des mathématiques appliquées) est défini par les cinq composants suivants (pour plus de détails, voyez l’ouvrage de C. J. Date Database in depth: relational theory for practitioners) :Pour les habitants du Relationland, c’est la moindre des choses.
__________________
_ Faites simple, mais pas plus simple ! (A. Einstein) 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 (Bonne lecture !) |
|
|
|
00
|
|
|
#14 |
|
Invité de passage
![]() Consultant en Business Intelligence Inscription : mai 2011 Messages : 5 ![]() |
Bonjour,
Je me trompe peut être mais j'ai un doute sur le fait que la structure de départ soit en 5eme forme normale comme tu le dis pour les raisons suivantes : - le champ "derniere_document_version_id" de la table "document" permet de déterminer le champ document_id" (grâce à la redondance de l'information dans la table "document_version"); - or selon la FNBC "tous les attributs non-clé ne sont pas source de dépendance fonctionnelle vers une partie de la clé". La FNBC n'est donc pas respectée. Ton éclairage sera bienvenu. |
|
|
00
|
|
|
#15 | |
|
Expert Confirmé Sénior
![]() ![]() ![]() Spécialiste en bases de données Inscription : septembre 2006 Messages : 2 882 ![]() |
Bonjour,
Citation:
Relvar R is in BCNF if and only if for every nontrivial FD A → B satisfied by R, A is a superkey for R.Dans cette définition de référence, il n'est pas écrit « is the » mais « is a », définition que vous retrouverez dans SQL and Relational Theory, Database in depth: relational theory for practitioners, The Relational Database Dictionary, etc. Dans le contexte SQL, vous pouvez remplacer le terme Relvar par celui moins précis de Table. Pour savoir ce qu’est une surclé (superkey) ou une dépendance fonctionnelle non triviale (nontrivial FD), je vous renvoie à Bases de données relationnelles et normalisation. Notez encore que A et B ne sont pas des attributs, mais des ensembles d'attributs (au sens de la théorie des ensembles). En passant, ce ne sont pas non plus des champs, le terme Champ étant totalement étranger au vocabulaire relationnel (tout comme au vocabulaire SQL, avec lequel on utilise plutôt le terme Colonne). Vous pouvez aussi vous référer au Professeur Gardarin dans Bases de données, les systèmes et leurs langages : Une relation est en BCNF si et seulement si les seules dépendances fonctionnelles élémentaires sont celles dans lesquelles une clé détermine un attribut.Le Professeur Gardarin met en jeu le concept de dépendance fonctionnelle élémentaire (alias dépendance fonctionnelle totale ou irréductible à gauche), mais sa définition est équivalente à celle de Date. Côté français, on a encore la définition de Delobel et Adiba (Bases de données et systèmes relationnels) : Un schéma R = <U, F> est en troisième forme normale de Boyce-Codd-Kent (3FNBCK) si chaque fois que X → A, A ∉ X, est vérifiée dans R alors X contient une clé de R.Veuillez noter que X n’est pas un attribut, mais un sous-ensemble (non strict) d’attributs de R (au sens de la théorie des ensembles). Notez encore que dans cette définition, il est écrit « X contient une clé » et non pas « X contient la clé », une fois de plus contrairement à ce qui est écrit dans la définition que vous donnez. Maintenant, comme vous dites à propos de la table DOCUMENT en cause, {derniere_document_version_id} détermine {document_id} et la table DOCUMENT satisfait aux dépendances fonctionnelles suivantes : {document_id} → {derniere_document_version_id}Autrement dit, étant donné que document_id et derniere_document_version_id sont les seuls attributs de la table DOCUMENT, {document_id} et {derniere_document_version_id} sont les déterminants des seules DF non triviales et ce sont des surclés : la BCNF (la vraie) est respectée. La 5NF l’est aussi, en vertu du théorème suivant de Date et Fagin : Si la relvar R est en BCNF et si chaque clé est singleton (c'est-à-dire si elle ne comporte qu’un seul attribut), alors R est en 5NF.DOCUMENT est aussi en 6NF. Pour vous éviter de vous lancer dans l’étude des dépendances de jointure, vous pouvez vous appuyer sur l’observation suivante (que vous retrouverez dans les ouvrages déjà mentionnés de C. J. Date) : Relvar R is in 6NF if and only if it’s in 5NF, is of degree n, and has no key of degree less than n-1.Voilà... ⁽¹⁾ Examinez le tableau périodique des éléments. On y voit que l’élément de numéro atomique 6 a pour nom Carbone, pour symbole C, pour masse atomique 12, etc. Aucun autre élément ne possède les caractéristiques de cet élément : numéro atomique, nom, symbole, masse atomique, etc. sont autant de propriétés uniques et chacune d’elles est candidate à faire l’objet d’une clé : dans la théorie relationnelle on dira que {numéro atomique}, {nom}, {symbole}, {masse atomique}, etc. sont des surclés et même, parce qu'elles sont irréductibles, des clés candidates de la table ELEMENT (ou plus simplement clés). Qui plus est, il y aurait bien un Yaka pour en remettre une couche et — au grand dam de Nicolas — ajouter d’autorité un attribut technique de type UNIQUEIDENTIFIER, décrétant que c’est cet attribut qui fera l'objet de la clé de la table... Si on se réfère à votre définition de la forme normale de Boyce-Codd, la table ELEMENT est délinquante, horresco referens !
__________________
_ Faites simple, mais pas plus simple ! (A. Einstein) 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 (Bonne lecture !) |
|
|
|
30
|
|
|
#16 | ||
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 668 ![]() |
Désolé de ma réponse très tardive, et merci à tous de votre participation, surtout fmsrel.
Citation:
![]() Citation:
J'ai oublié de dire que la table document_version est assez volumineuse (50 millions de lignes environ, stockant un document XML. On cherche donc a récupérer la dernière version d'un document le plus rapidement possible. Dans ce cas le stockage de la version dans la table document, qui est toujours filtrée sur sa clé primaire, est la meilleure. @++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes. Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012 |
||
|
00
|
|
|
#17 |
|
Membre Expert
![]() Pacman PacmanBusiness analyst Inscription : juin 2004 Messages : 1 417 ![]() |
Salut Elsuket,
Si c'est pour les performances, un index sur (docid, version) sur la table des versions devrait te permettre de chopper la dernière version assez facilement non ? (soit en faisant la jointure du max sur la table des versions, soit en essayant avec de la fonction analytique si les indexes sont bien utilisés...)
__________________
(c'est ma photo) Paku, Paku ! Pour les jeunes incultes : non, je ne suis pas un pokémon... Le pacblog : http://pacmann.over-blog.com/ |
|
00
|
|
|
#18 | |
|
Expert Confirmé Sénior
![]() ![]() ![]() Spécialiste en bases de données Inscription : septembre 2006 Messages : 2 882 ![]() |
Ave Nicolas, ave Paku,
Citation:
Quant aux mises à jour, n’oubliez pas que l’ajout d’une ligne dans votre table DOCUMENT déclenche aussi la mise à jour de l’index (s’il existe) plaqué sur la colonne latest_document_version_id, ce qui n’est pas neutre. Et si vous avez besoin d’effectuer une jointure des deux tables, n’oubliez pas qu’avec votre structure, vous risquez d'avoir des problèmes d’I/O bound particulièrement gênants vu la volumétrie, à moins que le cluster ratio des index sur les colonnes document_id et document_version_id soit voisin (ou dans le cas contraire, d’avoir des caches gigantesques et autres palliatifs onéreux du même genre). => Il serait bien d’obtenir un bilan des performances comparées des deux systèmes (prototypage des peformances).
__________________
_ Faites simple, mais pas plus simple ! (A. Einstein) 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 (Bonne lecture !) |
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com