|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Consultant en technologies Inscription : décembre 2011 Messages : 3 ![]() |
Bonjour,
Dans un MPD, il y a 3 tables 1 table « mère » OPERATIONCOMPTABLE et 2 tables « filles » CREDIT et DEBIT. Mon DBA dit que La table CREDIT n’a aucun intérêt en tant que table physique (elle contient 3 colonnes qui sont des clés étrangères). La table DEBIT ne gère physiquement qu’un n° de chèque (elle contient 8 colonnes dont 7 sont des clés étrangères). D’un point de vue fonctionnel, l’opération comptable est forcément un mouvement de crédit ou un mouvement de débit : la gestion d’une opération comptable dans la table OPERATIONCOMPTABLE est forcément associé à la gestion d’un débit dans la table DEBIT ou d’un crédit dans la table CREDIT (donc pas d’existence seule possible de la table OPERATIONCOMPTABLE). Et il propose Aucun intérêt à gérer 1 table mère + 2 tables filles (complexité de gestion à gérer plusieurs tables) Proposition : solution idéale d’un point de vue modélisation des données dans une base relationnelle (selon moi) : regrouper les spécificités au niveau de la table mère (1 seule table + ajout d’un indicateur sens de l’opération ; la couche de mapping objet java/élément SQL permet de s’abstraire des données ne concernant pas la sous-classe traitée, DEBIT ou CREDIT) Je suis tout à fait d'accord avec lui, et vous ? Merci d'avance de votre contribution. Cadao |
|
|
00
|
|
|
#2 | ||
|
Expert Confirmé
![]() Inscription : juillet 2007 Messages : 2 184 ![]() |
Bonjour Cadao,
Intéressante question. En fait, tout est dans Citation:
Citation:
Si tout est dans la même table, pour les crédits, tous les attributs concernant les débits seront "nuls" et inversement pour les débits. Il faudrait étudier la pertinence des attributs de chacun.
__________________
Dis-nous et à bientôt, Richard. ---------------------------------------------------------------------------------------------- . et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !
|
||
|
|
10
|
|
|
#3 | ||
|
Invité de passage
![]() Consultant en technologies Inscription : décembre 2011 Messages : 3 ![]() |
Bonjour Richard_35,
Merci votre analyse, voici les trois tables Code SQL :
|
||
|
|
00
|
|
|
#4 | ||
|
Expert Confirmé
![]() Inscription : juillet 2007 Messages : 2 184 ![]() |
D'après ce que je comprends (sauf défaut de reverse engineering mental...) :
Code :
__________________
Dis-nous et à bientôt, Richard. ---------------------------------------------------------------------------------------------- . et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !
|
||
|
|
00
|
|
|
#5 |
|
Membre éprouvé
![]() Inscription : janvier 2009 Messages : 301 ![]() |
Bonjour,
Je ne suis pas un spécialiste de la modélisation, mais je suis d'accord avec ton DBA. En effet, je ne vois pas la nécessité de créer trois entités pour enregistrer une écriture comptable (40 ans d'expérience dans le métier, ça vous marque pour le reste de votre vie). Personnellement, ma table Ecriture aurait le schéma suivant Ecriture(EcritId, NoPlanComptable#, EcritDate, EcritNoPiece, EcritLibelle, EcritSens, EcritValeur) La colonne EcritSens contiendrait 1 si débit et -1 si crédit. Cette approche permet de distinguer, dans les calculs, les valeurs de débit et de crédit. Le calcul se fait simplement par EcritSens * EcritValeur = + / - suivant la situation. Il n'existe plus de NULL car chaque ligne comptable comprend obligatoirement une somme qui un débit ou un crédit Bien entendu, cette écriture sera Foreign Key avec le plan comptable. PlanComptable ---0,n---[Appartenir]----1,1--- Ecriture Pour un examen plus attentif, il serait bien que tu nous communiques ton MCD, MLD ou MPD plutôt que tes tables @+ |
|
|
00
|
|
|
#6 |
|
Expert Confirmé
![]() Inscription : juillet 2007 Messages : 2 184 ![]() |
Bonjour Seabs,
Je suis d'accord avec toi... dans l'absolu. Mais, dans le cas qui nous occupe, je n'ai pas compris où tu stockes les champs spécifiques au crédits et ceux spécifiques aux débits (voir posts #3 et #4).
__________________
Dis-nous et à bientôt, Richard. ---------------------------------------------------------------------------------------------- . et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !
|
|
|
00
|
|
|
#7 | |||||
|
Membre éprouvé
![]() Inscription : janvier 2009 Messages : 301 ![]() |
Bonjour,
@Richard Citation:
Ensuite, il suffit de créer une VUE pour reconstituer les débits et les crédits. Code :
Code :
Maintenant, il convient d'adapter ce schéma au cas présenté. D'ailleurs, à ce sujet, il me semble que les NULL sont possibles dans pratiquement toutes les colonnes. Je pense, que si cela est le cas, il serait peut être nécessaire de vérifier la mise en place d'une valeur par défaut et de supprimer la possibilité du NULL ou plus simplement l'obligation d'entrer une valeur. Exemple : MOISCOMPTABLE avec possibilité d'inclure un NULL ne me paraît pas très satisfaisant ? @+ |
|||||
|
|
00
|
|
|
#8 | |
|
Expert Confirmé
![]() Inscription : juillet 2007 Messages : 2 184 ![]() |
Bonjour à toi Seabs (et à Cadao, si toujours présente),
Citation:
__________________
Dis-nous et à bientôt, Richard. ---------------------------------------------------------------------------------------------- . et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !
|
|
|
|
00
|
|
|
#9 | |||||||
|
Membre éprouvé
![]() Inscription : janvier 2009 Messages : 301 ![]() |
Bonjour,
Effectivement, Cadao semble ne plus répondre. @Richard Citation:
Parmi les règles de gestion de la comptabilité, il y a celle-ci : Une ligne d'écriture ne comporter qu'une seule valeur qui est un débit ou un crédit. Ainsi, aucune écriture ne peut comporter une valeur au débit et une valeur au crédit en simultané. Si nous reprenons, un livre d'écritures comptables, nous aurons : Code :
La traduction, en simplifiant, dans la table des écritures sera : Code :
Une comptabilité n'aura jamais, dans l'état actuel du droit comptable, une ligne avec le schéma ci-après Code :
@+ |
|||||||
|
|
10
|
|
|
#10 | ||
|
Expert Confirmé
![]() Inscription : juillet 2007 Messages : 2 184 ![]() |
Bonjour Seabs et excellente année 2012,
Oui, oui, entièrement d'accord et je sais tout cela. Mais je ne pense pas que le débat soit sur ce plan. Citation:
Revoyons la structure des tables DEBIT et CREDIT :
Nous voyons que les entités DEBIT et CREDIT ont des attributs propres et, par conséquent, la séparation des tables me semble judicieuse. Certains de ces attributs sont, en plus, des clés étrangères. En revanche, effectivement, il faut mettre en place un contrôle (trigger) qui empêche l'enregistrement d'un crédit et d'un crédit pour une même opération comptable :
Ce qui respecte ta juste remarque : Citation:
__________________
Dis-nous et à bientôt, Richard. ---------------------------------------------------------------------------------------------- . et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !
|
||
|
|
00
|
|
|
#11 | |
|
Membre éprouvé
![]() Inscription : janvier 2009 Messages : 301 ![]() |
Bonjour,
@Richard_35 Je te remercie de tes vœux 2012 et te présente les miens en retour. En ce qui concerne notre débat, je veux bien tout, mais il me semble que le DBA et Cadao ne soit pas d'accord. Il doit y avoir une raison. Citation:
Je ne vois pas pourquoi, il existe plus d'informations pour les débits que pour les crédits. Exemple : un bénéficiaire au débit et aucun tiers au crédit ? Et pourtant si nous avons un fournisseur au débit (Paiement), nous aurons un client au crédit (Encaissement). Les tables ne traitent que les opérations financières, quid des achats, des ventes, des opérations diverses, etc Notre ami semble ignorer, dans sa modélisation, que la comptabilité s'appuie sur un plan comptable ce qui le conduit, très certainement, vers l'ajout de colonnes. Tant que nous n'aurons pas l'avis de Cadao, il me semble difficile d'aller plus loin dans notre discussion. @+ |
|
|
|
10
|
|
|
#12 |
|
Expert Confirmé
![]() Inscription : juillet 2007 Messages : 2 184 ![]() |
Certes (et merci pour tes "retours de voeux").
Il n'empêche qu'au problème posé, et en ne se tenant qu'à cet énoncé, le fait que les crédits et les débits aient leurs propres attributs justifie la présence des deux entités. Effectivement, la remise en cause de ces attributs propres, et, en final, leur suppression, justifierait une unique entité OPERATIONCOMPTABLE.
__________________
Dis-nous et à bientôt, Richard. ---------------------------------------------------------------------------------------------- . et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !
|
|
|
00
|
|
|
#13 |
|
Membre Expert
![]() ![]() Franck PachotDBA Oracle Inscription : novembre 2007 Messages : 706 ![]() |
Bonjour,
Une opération étant soit un crédit, soit un débit, il faut une table OPERATION qui a un type d'opération Débit ou Crédit. Je ne connais pas de SGBD où on puisse implémenter ça dans 2 tables de manière performante. Un trigger devrait vérouiller toute la table CREDIT lorsqu'on rentre un DEBIT, pour être sûr que personne n'est en train de rentrer un CREDIT avec le même numéro d'opération. Il y a des attributs communs qui seront dans OPERATION. Le mode de versement et la FK vers la contre écriture, c'est commun aux 2. Il a a des attributs spécifiques qu'on peut mettre dans OPERATION et d'autres qu'on peut mettre dans une tables spécifiques DETAIL_DEBIT. Un NULL n'est pas un problème dans un SGBDR. Il peut même avoir une taille nulle. Le choix ne peut se faire qu'en connaissant la manière dont seront interrogées les données. Par exemple, si on demande toutes les opérations qui sont soit des crédits soit des débits en espèce, ce serait dommage d'avoir à faire une jointure. Et puisque ces informations sont toutes des FK vers d'autres tables, dommage de faire une référence vers une référence au lieu d'un lien direct. Et ce serait DETAIL_DEBIT qui référencerait OPERATION et non l'inverse. Il n'ont sûrement pas le même cycle de vie (purge/archivage des détails tout en gardant l'opération par exemple). DETAIL_DEBIT aurait une contrainte sur la FK vers opération, qui serait aussi sa PK. L'avis du DBA se base sur ce qui fonctionne bien sur un SGBDR: éviter de multiplier tables, index, jointures inutiles et utiliser les NULL qui sont très bien implémentés. C'est très bien pour un MPD, pour l'implémentation sur un SGBDR. La théorie relationelle et/ou la modélisation objet peuvent par contre préférer de nombreuses entités, des généralisations/spécialisations, et pas de NULL. C'est très bien pour un MCD, modèle métier. Avoir un héritage qui définit bien les concepts d'opération, d'opération de crédit et d'opération de débit est très utile pour modéliser et discuter tous les interlocuteurs. Pour les comptables, débit et crédit sont 2 choses différentes. Pour d'autres utilisateurs, ce sont toutes des opérations avec un montant positif ou négatif. Le fait d'éclater dans des concepts différents permet de parler aux deux. Mais le MCD doit au final s'implémenter sur un SGBD et doit être performant, évolutif, scalable, accepter la concurrence d’accès, vérifier l'intégrité des données, etc. Les contraintes sont très bien gérées dans ces contextes (unique, référence, not null, etc.) Ce serait dommage de mettre des triggers qui vérouillent des tables entières pour assurer un intégrité. Ce serait dommage de rajouter une FK et un index pour éviter un null qui prend 0 octets. Et avec une seule table, lorsqu'on va saisir un mouvement en 2 opérations (débit et contre écriture de débit) elles seront ensembles. Dans le même bloc de disque. Dans la même page de cache. Et c'est plutôt bien, vu qu'on va souvent les interroger ensemble. Ce serait dommage d'éclater au niveau physique ce qui va être accédé ensemble. Et puis si on veut au contraire les éclater physiquement, pas besoin de toucher au modèle logique: il suffit de partitionner sur le type d'opération. Cordialement, Franck.
__________________
A lire sur mon blog Oracle - Articles d'Experts des articles traduits en français de Jonathan Lewis, Tom Kyte, Doug Burns, Cary Millsap, Greg Rahn ...
|
|
00
|
|
|
#14 | ||
|
Expert Confirmé
![]() Inscription : juillet 2007 Messages : 2 184 ![]() |
Bonjour Franck (et excellente année 2012),
Je n'ai pas bien compris. Citation:
Citation:
A moins que je n'ai rien compris, ce qui est somme toute possible, cela semble contradictoire, non ? Reprenons le cas de Cadao (si elle est toujours avec nous...) : Option "une seule table" : OPERATIONCOMPTABLE(ID, Debit_Credit (D/C), #CREDIT_LN_MODEVERSEM_MODEVERSEMENT,#CREDIT_CONTREECRITUREDEBIT, DEBIT_NUMEROCHEQUE, #FICHEBENEFICIAIRE_DEBIT, #DECLARATION_DEBIT, #DEBIT_LN_MODEREGLEM_MODEREGLEMENT, #DEBIT_LN_MODERE_MODEREGLMTCLOTURE, #DEBIT_CONTREECRITURECREDIT, #DEBIT_OPERATIONLIVRET)
Option "trois tables" : OPERATIONCOMPTABLE(ID, ... [attributs communs aux débits et aux crédits])
__________________
Dis-nous et à bientôt, Richard. ---------------------------------------------------------------------------------------------- . et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !
|
||
|
|
00
|
|
|
#15 | |||
![]() ![]() |
Citation:
![]() Citation:
Citation:
Le processus qui crée le crédit ou le débit crée en même temps l'opération grâce à un trigger, ou bien le processus qui crée l'opération récupère son identifiant pour ensuite l'affecter à la création du crédit ou du débit correspondant. Dans les deux cas, puisqu'il qu'il y a héritage de l'opération, il faut créer l'opération en premier et une fois qu'elle est créée, aucun problème pour qu'une autre soit créée.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
|||
|
00
|
|
|
#16 | |||||
|
Membre Expert
![]() ![]() Franck PachotDBA Oracle Inscription : novembre 2007 Messages : 706 ![]() |
Bonjour Richard,
En fait je ne comparais pas les 2 options 1 table ou 3 tables. je montrais seulement les questions à se poser pour modéliser. Il me paraît évident d'avoir une table OPERATIONCOMPTABLE. Il est par contre possible d'avoir certaines colonnes spécifiques dans une autre table. J'en profite pour commenter les remarques. Ce n'est pas pour critiquer point par point, mais pour vérifier que le modèle proposé tient la route. Option "une seule table" : Citation:
CREDIT_CONTREECRITUREDEBIT et DEBIT_CONTREECRITURECREDIT ce sont des pléonasmes. La contre écriture d'un débit est toujours un crédit et inversement. L'attribut d'une opération, c'est juste CONTREECRITURE Idem pour CREDIT_LN_MODEVERSEM_MODEVERSEMENT et DEBIT_LN_MODEREGLEM_MODEREGLEMENT. Toute opération a un mode de paiement. C'est une colonne commune MODE_PAIEMENT. Et une subtilité pour faire en sorte que la contre écriture d'un débit ne puisse pas être un débit: le type d'opération (D/C) devrait faire partie de la clé de OPERATIONCOMPTABLE. Donc la FK vers la contre écriture, c'est (CONTREECRITURE_TYPE,CONTREECRITURE_ID) et on a une contrainte du genre CHECK ( TYPE <> CONTREECRITURE_TYPE ) Citation:
- 2 octets de stockage pour gagner beaucoup en performance et lisibilité. - pas d'erreur avec une contrainte d'intégrité qui vérifie que le type et le remplissage sont compatibles. Citation:
Citation:
En plus, ici, je pense qu'il n'y a que le crédit qui peut avoir des infos nulles. On les met à la fin et c'est zéro octets. Option "trois tables" : Citation:
C'est quand même plus couteux: chaque insertion va mettre à jour 2 tables, verrouiller 2 enregistrements et maintenir au minimum 2 indexes. 2 fois plus de travail, c'est des temps de réponse 2 fois plus longs. Sur une saisie, on ne le voit pas. Mais sur 100 utilisateurs concurrents, ou sur un batch d'import, c'est plus gênant. Lorsque je parlais de l'impossibilité de gérer l'intégrité par trigger, je pensais à une solution "2 tables: CREDIT et DEBIT". Cette solution pourrait tenir la route mais impossible de gérer un numéro d'opération unique sur les 2 tables. Cordialement, Franck.
__________________
A lire sur mon blog Oracle - Articles d'Experts des articles traduits en français de Jonathan Lewis, Tom Kyte, Doug Burns, Cary Millsap, Greg Rahn ...
|
|||||
|
00
|
|
|
#17 |
|
Invité de passage
![]() Consultant en technologies Inscription : décembre 2011 Messages : 3 ![]() |
Bonjour le groupe,
Tout d'abord, je vous présente tous mes voeux pour l'année 2012 et que la paix et la joie soient avec vous ainsi que votre chère famille. Etant absente et revenue seulement hier, j'ai pu parlé avec le DBA, l'architecte, à propos de ce sujet, voici la conclusion : En fait, dans le cadre de ce projet, il en faut une table opération comptable et 2 table filles CREDIT et DEBIT, car pour chaque de ces entités, il y a ses propres opérations, par exemple CREDIT -> MODE VERSEMENT -> ECRITURE CREDIT DEBIT -> MODE REGLEMENT -> DECLARATION Voilà, encore une fois, je tiens à vous remercie, grâce à vous, ma connaissance en matière de conception est (sera) enrichie. CaDao |
|
|
00
|
|
|
#18 |
|
Expert Confirmé Sénior
![]() ![]() ![]() Spécialiste en bases de données Inscription : septembre 2006 Messages : 2 884 ![]() |
Bonsoir,
Dans cette affaire, les différentes positions sont légitimes, ô combien... Notamment la position de seabs du fait de son approche unificatrice et imparable : Ecriture (EcritId, NoPlanComptable#, EcritDate, EcritNoPiece, EcritLibelle, EcritSens, EcritValeur)Notamment, la position de Richard quand à son refus de mettre tous les œufs dans le même panier (un numéro de chèque, une fiche bénéficiaire ne concernent que les débits, etc.) et sa volonté de faire la chasse au bonhomme Null qui est le grand inhibiteur des optimiseurs des SGBD. Pourquoi ne pas procéder à l'union des points de vue ? Dans le diagramme ci-dessous, la vision seabsienne est prise en compte au sein de l’en-tête de la table OPERATION_COMPTABLE, tandis que les spécificités chères à Richard font l’objet de tables dédiées (je n’ai pas tout fait figurer, d’où les pointillés, car il y a bien des indéterminations dans le système proposé par cadao) : Vous noterez, cadao, que Null est banni systématiquement et il y a là un défi que vous avez à relever quant à la structure de vos propres tables... Vos opinions sur ce début de représentation alternative ?
__________________
_ 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
|
|
|
#19 | |
|
Membre Expert
![]() ![]() Franck PachotDBA Oracle Inscription : novembre 2007 Messages : 706 ![]() |
Bonsoir,
Citation:
Merci, Franck.
__________________
A lire sur mon blog Oracle - Articles d'Experts des articles traduits en français de Jonathan Lewis, Tom Kyte, Doug Burns, Cary Millsap, Greg Rahn ...
|
|
|
00
|
|
|
#20 |
|
Membre éprouvé
![]() Inscription : janvier 2009 Messages : 301 ![]() |
Bonjour,
@fsmrel Je suis tout à fait d'accord avec cette présentation du MCD. C'est une modélisation dans ce style que je viens de conduire pour mettre en place une gestion prévisionnelle de la trésorerie dans une PME. Comme vous, j'ai évacué les informations complémentaires dans les entités annexes. Ainsi, tous les Null ont disparu. Maintenant, à @cadao de choisir ce qui lui convient le mieux. A+ |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com