|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | ||
|
Expert Confirmé Sénior
![]() ![]() ![]() Inscription : mars 2004 Messages : 5 849 ![]() |
Salut,
J'ai fait ce petit méta modèle pour créer des entités, des propriétés, des types de données, des instances et les valeurs associées: J'aimerai recevoir vos critiques à son sujet. Dites moi tout ce qui ne vous parait pas correct. Merci d'avance Ci-dessous le code de génération: Code :
|
||
|
00
|
|
|
#2 |
|
Membre Expert
![]() Inscription : mars 2005 Messages : 1 565 ![]() |
C'est jeopardy ? Sans problème exposé un modèle n'est ni bon ni mauvais.
|
|
|
00
|
|
|
#3 | ||||||||||||
|
Expert Confirmé Sénior
![]() ![]() ![]() Spécialiste en bases de données Inscription : septembre 2006 Messages : 2 884 ![]() |
Bonsoir,
vmolines a raison... Le lecteur est invité à émettre des hypothèses quant à la sémantique qui transpire du diagramme. En logique, les termes entité et instance sont synonymes. On va supposer que par entité vous voulez dire entité-type. Remontons au niveau conceptuel, disons Merise (mais ça peut être au niveau diagramme de classes UML, mutatis mutandis). L’entité-type ValeurJeu est en réalité une association-type entre les entités-types ProprieteJeu et InstanceJeu : elle a pour identifiant la paire {Propriete_ID, Instance_ID}. Au niveau logique vous avez préféré mettre en œuvre ex nihilo un attribut ID pour servir de clé primaire : libre à vous, vous avez certainement un motif pour procéder ainsi, mais cet attribut n’offre a priori aucun intérêt et devrait passer au rasoir d’Ockham (en plus on ferait l’économie d’un index). Si vous le conservez, en toute logique la paire {Propriete_ID, Instance_ID} devrait faire l’objet d’une clé alternative (clause UNIQUE), à moins que vous n’ayez décidé que cette paire puisse engendrer des doublons, auquel cas l’attribut Val participerait à la clé primaire. Si les valeurs prises par la paire {Propriete_ID, Instance_ID} de l’entité-type ValeurJeu doivent être des valeurs prises par la paire {Propriete_ID, Instance_ID} de l’entité-type ProprieteInstance, alors il existe une contrainte d’inclusion faisant qu’il faut rompre les liens entre ValeurJeu et ProprieteJeu d’une part et InstanceJeu d’autre part, au bénéfice d’un lien (clé étrangère) entre ValeurJeu et ProprieteInstance (cf. proposition ci-dessous). Je relève que les table ValeurJeu et ProprieteInstance peuvent contenir des incohérences. Supposons que la base de données ait la valeur suivante à un instant t : Code :
Code :
Code :
Code :
Code :
Cela est peut-être normal, mais si ça ne l’est pas, la modélisation est à revoir. Si sémantiquement parlant ProprieteJeu et InstanceJeu sont des propriétés multivaluées de EntiteJeu, alors on fait jouer l’identification relative et les clés primaires seraient les suivantes : ProprieteJeu : {Entite_ID, Propriete_ID} ; InstanceJeu : {Entite_ID, Instance_ID} ; Les tables ProprieteInstance et ValeurJeu seraient alors dotées d’un attribut supplémentaire Entite_ID (un et un seul bien entendu). Les clés primaires seraient les suivantes : ProprieteInstance : {Entite_ID, Propriete_ID, Instance_ID} ; ValeurJeu : {Entite_ID, Propriete_ID, Instance_ID}, ou {Entite_ID, Propriete_ID, Instance_ID, Val_Id} si ça ne suffit pas. Une proposition (ne faites pas attention au changement du type des attributs en char(8) et autres incongruités, je me simplifie simplement la vie au sujet des jeux d'essai...) : Code SQL :
Du métabolisme. Vous utilisez systématiquement la clause ON DELETE NO ACTION. Le défi sémantique est d’utiliser la clause ON DELETE CASCADE quand elle est pertinente. Par exemple, autant il serait mal venu de retenir CASCADE pour la contrainte (FK_TypeDonneePropriete), autant pour les autres contraintes il y a une réflexion à mener.
__________________
_ 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
|
|
|
#4 |
|
Membre Expert
![]() |
Salut immobilis...
Je ne connais pas les volumétries mises en jeu mais je t'encourage juste à réfléchir à tes typages, aspect souvent négligé chez les développeurs(j'entends par développeur les non DBA...). A savoir: Est'il pertinent pour toi d'utiliser un NVARCHAR qui est je le rappel deux fois plus coûteux que le VARCHAR? (internationalisation avec plusieurs langues différentes à gérer....). Vas tu avoir plus de 32767 type de propriétés? (en clair un SMALLINT ne suffit-il pas) etc...
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir. |
|
|
00
|
|
|
#5 |
|
Expert Confirmé Sénior
![]() ![]() ![]() Inscription : mars 2004 Messages : 5 849 ![]() |
Salut à tous et merci pour vos interventions.
@fsmrel merci pour ton analyse et j'apprécie beaucoup la qualité de ta rédaction @iberserk Salut ![]() @vmolines tu pourrais au moins dire bonjour @vous_trois mes excuses. Je suis allé un peu vite dans la création de mon fil. Je vous dois plus d'explications. Je cherche à réaliser une base de données dont l'architecture est faite sur des métadonnées. Puis-je l'appeler métamodèle? L'url ci-dessus renvoi vers le tuto de sqlpro. C'est un bon point de départ. J'aimerai aller plus loin. J'ai donc réalisé ce premier modèle. L'idée est donc de pouvoir enregistrer en base des structures de Types avec leurs propriétés typées et d'enregistrer des instances. Dans une seconde version, afin d'optimiser la base (pour iberserk Pour réaliser ce modèle, j'ai utilisé un Entity Data Model. Le typage obtenu n'est pas le plus adapté. Pour le coup cela suffit dans un premier temps pour faire des brouillons. Je me sert aussi de Dynamic Data pour tester le modèle. @fsmrel je vais continuer de décortiquer ta proposition. S'agissant d'un stade de conception, j'aurai pu poster dans le forum idoine mais je voulais un avis de DBA. Merci à tous. Je me permet de garder le fil ouvert pour vous faire un retour. Si un modo juge que le fil doit être déplacé pas de soucis. |
|
00
|
|
|
#6 | ||
|
Membre Expert
![]() |
Citation:
pas côté client (dis moi que ce n'est pas ce que tu voulais faire :-)).Citation:
Quand je suis arrivé ils avaient mis en place une table avec 4 colonnes (une par type les booléen 0 et 1 étant stockée dans la colonne int) Nous revenons maintenant en arrière et migrons vers une seule colonne VARCHAR, les TRIGGERS se chargeant de vérifier l'intégrité des données. Nous gagnons sur tous les tableaux: volumétrie, nombre d'index moindres etc.
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir. |
||
|
|
00
|
|
|
#7 |
|
Membre Expert
![]() Inscription : mars 2005 Messages : 1 565 ![]() |
Bonjour à tous,
@immobilis désolé pour mon entrée en matière un peu brutale, tu as raison de le faire remarquer. @iberserk Le choix d'opter pour le non-typage des valeurs (toutes en varchar) est-il possible car vous n'avez pas de traitements qui nécessitent un typage fort de vos valeurs dans votre projet (écriture/restitution telles quelles) ? Si oui, auriez-vous opté pour ce typage simple si vous aviez eu des traitements comme des sommes, des opérations sur des dates, ... ? |
|
|
00
|
|
|
#8 | |
|
Expert Confirmé Sénior
![]() ![]() ![]() Spécialiste en bases de données Inscription : septembre 2006 Messages : 2 884 ![]() |
Bonsoir,
Citation:
Par exemple, Merise a un métamodèle pour décrire les objets de la méthode, et eux seuls. En voici une vue partielle : Voici une autre vue, représentant le métamodèle des contraintes avec Merise (extrait de l’article d’Yves Tabourier in afcet - Le formalisme de données Merise - Extensions du pouvoir d’expression - Journée d’étude organisée par le Groupe de Travail 135 « Conception des systèmes d’information (Collège AFCET-GID) - Jeudi 15 novembre 1990, Paris). ![]() Au sujet des contraintes (pivot, portée, etc.) Voir par exemple ici, notamment la figure 9.
__________________
_ 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
|
|
|
#9 | |
|
Membre Expert
![]() |
Citation:
Mais nous avons malgré tout des traitements nécessitant des typages fort (CAST) sans que cela pose de problème, les CAST sont effectués à la volée dans les requêtes. A partir du moment ou tu met en place un modèle qui assurent sa propre cohérence des données (et donc ne pas déléguer cela à la couche métier du code client comme c'était le cas avant...) le requetage se fait les yeux fermés sans se demander si le CAST va exploser...
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir. |
|
|
|
00
|
|
|
#10 | ||||
|
Expert Confirmé Sénior
![]() ![]() ![]() Inscription : mars 2004 Messages : 5 849 ![]() |
Citation:
![]() Quelle utilisation fais-tu d'un trigger dans ce cas? Comment passes-tu un objet à la base pour qu'elle le décompose et le stock? Citation:
Citation:
Citation:
@fsmrel Je continue de décortiquer ta première proposition. J'ai une première question. Pourquoi utiliser des ID sur 8 caractères plutôt qu'un entier autoincrémenté? A+ |
||||
|
00
|
|
|
#11 | |
|
Expert Confirmé Sénior
![]() ![]() ![]() Spécialiste en bases de données Inscription : septembre 2006 Messages : 2 884 ![]() |
Bonsoir,
Dans le monde des bases de données relationnelles, le terme approprié est plutôt celui d’« ensemble ». En effet, l’algèbre relationnelle opère sur des relations (cf. les opérateurs UNION, INTERSECTION, etc.) Je cite Georges Gardarin : « Le concept de relation découle directement de la théorie des ensembles. » (G. Gardarin. Bases de données. Les systèmes et leurs langages. (Eyrolles, 1988), page 66). Cela dit, les relations du Modèle Relationnel de Données se distinguent des relations telles quelles sont perçues en mathématiques, par exemple parce qu’elles ont un en-tête et que les attributs composant celui-ci ont un nom et peu importe leur ordre. Je vous renvoie à The Database Relational Dictionary. Citation:
__________________
_ 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 | |
|
Membre Expert
![]() |
Citation:
Mais cette solution est faisable bien entendu. De toute façon il faut que tu te pose des questions sur l'usage que tu va faire de ta base... Pour rappel nos données sont essentiellement utilisées à des fins d'affichage... Le données sont récupérées telles qu'elles sont en base puis nous passons par des mapper de DomainModel pour créer des objets structurés.
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir. |
|
|
|
00
|
|
|
#13 | ||
|
Membre Expert
![]() |
Citation:
![]() il y a deux semaines... déploiement chez un client, évolution du lot d'import des données... Insertions de plus d'un million de caracteristiques... Le client avait fait une erreur sur ses fichiers plats... le TRIGGER lui a tout de suite réglé son compte... Or ici ton code client n'est pas appelé (un import de cette volumétrie en code non ensembliste n'est pas viable...). Citation:
Le rôle du TRIGGER est essentiellement de vérifier lors d'INSERT ou d'UPDATE que les données insérées sont bien du type de la caractéristique auquel il est rattaché...
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir. |
||
|
|
00
|
|
|
#14 | |
|
Membre Expert
![]() |
Citation:
![]() mais nous ne faisons pas ce genre d'opération... nous avons des objets 'de base' qui contiennent des colonnes 'de base' (exemple pour un article: date de création ou prix...)
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir. |
|
|
|
00
|
|
|
#15 | |||
|
Expert Confirmé Sénior
![]() ![]() ![]() Inscription : mars 2004 Messages : 5 849 ![]() |
Citation:
Probablement que la base de données gagnerait tout de même, mais je ne suis pas certain que la différence entre les deux serait si grande. Si en plus tu ajoutes SQL Service Brooker on peut faire un pari sur la différence de temps ![]() Citation:
En plus, si j'ai une erreur sur une ligne, je saurai facilement la mettre de côté, traiter les autres et informer l'utilisateur final (pas un technicien) des erreurs. Citation:
A+ |
|||
|
00
|
|
|
#16 | ||
|
Membre Expert
![]() |
Citation:
Citation:
Mais encore une fois tu pars du principe que seule ton application modifiera ta base de données... C'est un pari bien audacieux! Qu'adviendra t'il quand une autre application, un DBA (un développeur ) viendra faire une petite requête de modification 'qui ne risque rien'.Pour la modélisation, il serait intéressant d'avoir l'avis de SQLPRO par exemple qui est l'auteur d'un tutoriel sur cette modélisation.
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir. |
||
|
|
00
|
|
|
#17 | ||
|
Expert Confirmé Sénior
![]() ![]() ![]() Inscription : mars 2004 Messages : 5 849 ![]() |
Pour tenir le pari oui. Sinon, dans la vrai vie, j'essaierai de passer par un package SSIS.
Citation:
Citation:
A+ |
||
|
03
|
|
|
#18 |
|
Membre Expert
![]() Inscription : mars 2005 Messages : 1 565 ![]() |
Vos applications présentent et permettent de saisir des données qui finissent dans une base de données. Si c'est la base de données qui les stocke, qui de mieux placé pour garantir leur qualité et leur intégrité ? Pensez vous sincèrement que séparer le stockage des données de leur garantie qualité est la meilleure assurance ?
Vous trouverez toujours un moyen de casser un système mis en place mais ça ne justifie pas d'avoir de plus mauvaises pratiques qui augmentent les problèmes potentiels. Vous justifiez l'absence de contrôle au niveau BDD en disant qu'il est toujours possible de casser une BDD qui dispose de contrôle. De plus, vous prenez un exemple qui traite d'une mise à jour indésirable de données faite par un développeur qui passe une requête update. Où est la perte de qualité et de cohérence des données avec une requête update ? Je ne vois qu'une mise à jour. Ma BDD avec tous ses contrôles sera toujours cohérente malgré cette requête update. Vous traitez d'un problème d'accès aux données qui est différent de la cohérence de celles ci. Un développeur qui accède à une base de prod pour faire du développement, c'est un tout autre problème. |
|
|
10
|
|
|
#19 | ||||
|
Expert Confirmé Sénior
![]() ![]() ![]() Inscription : mars 2004 Messages : 5 849 ![]() |
Bon c'était pas trop le sujet de départ...
Citation:
Perso, je pense pas que ce soit le rôle de la BD. La vérification ayant été faite par le code. Il n'est pas nécessaire de faire cette vérification une deuxième fois. C'est tout ce que je dis Pour ma culture, connaissez-vous la différence de temps pour insérer un million d'enregistrements avec et sans trigger?Citation:
Citation:
Citation:
A+ |
||||
|
01
|
|
|
#20 | ||||
|
Membre Expert
![]() |
Citation:
![]() Citation:
Je suis à moins de 4 minutes avec TRIGGER dans mon cas avec environ 1 million d'enregistrements sur un simple serveur de test (4 GIGA, sous système disque banal 2 coeurs...). Pas essayé sans TRIGGER... Citation:
Pour ma part je vais en rester là... argumenter ne semble pas servir à grand chose de toute façon... Citation:
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir. |
||||
|
|
10
|
Copyright © 2000-2012 - www.developpez.com