Conseil creation bdd

Conseil creation bdd - SQL/NoSQL - Programmation

Marsh Posté le 30-06-2008 à 11:18:52    

Bonjour a tous, j'espere que vous avez passe un bon week end :)
 
J'ai une base de donnees que je dois creer mais je bloque un peu...
il s'agit d'une base 'articles'
voila ce que j'ai fait jusqu'a present:
 
articles :
id  |  titre_en  |  titre_fr  |  resume_en  |  resume_fr  |  source  |  auteur  |  prix  |  ...
 
un article peut etre en plusieurs langues, j'ai donc cree une autre table 'articles_lang' :
id_article  |  langue
 
mais etant donne que chaque langue peut avoir une source et un auteur different, devrais je ajoute les champs 'source' et 'auteur' dans la table 'articles_lang' ???
 
ou sinon, y a t il un autre moyen plus optimise pour gerer ce genre de situation??
 
Merci beaucoup de votre aide!
 
Reda

Reply

Marsh Posté le 30-06-2008 à 11:18:52   

Reply

Marsh Posté le 30-06-2008 à 11:21:13    

comment ça chaque langue peut avoir une source et un auteur différent ??
 

Reply

Marsh Posté le 30-06-2008 à 12:16:24    

un article en francais a comme auteur 'Jean-luc Dupont' et comme source 'Hachette'
le meme article existe aussi en englais et a comme auteur 'Henry Martin' et comme source 'ZZZZ'

Reply

Marsh Posté le 30-06-2008 à 12:21:10    

Dans ce cas là, je virerai la colonne titre_fr et prix (qui peut varier selon la traduction) de articles.
Tu crées une table "Article_Traduits" avec "ID_article,Langue,Titre,Auteur,Source,Prix"
 
Tu crées une table Langue et éventuellement Source
avec pour Langue : ID_langue,Nom_langue
Source : ID_Source,Nom_Source


Message édité par antac le 30-06-2008 à 12:21:54
Reply

Marsh Posté le 30-06-2008 à 13:43:11    

et qu'est ce que je garde comme champs ds la table 'articles'??
 
j'ai pense a cette structure, qu'es pense(z) tu/vous?
 
table articles :  
id_tech  |  id_fonc  |  titre_original  |  titre  |  resume  |  langue  |  source  |  auteur  |  prix  |  isbn  |  ...
----------------------------------------------------------------------------------------------------------------------------
1               1                                Bonjour  Bonjour        fr             13          12         26     BL263    ...
2               1                                Hello      Hello           en            56          24         58     CR78
3               1                 Hola                                       es            78          33         30     CL78
 
 
Et biensur j'aurai une table sources, langues et auteurs qui contiendront les identifiants et noms...
 
Le fait d'avoir une seule table pour les articles evitera de chercher ds 2 tables lorsque l'utilisateur effectue une recherche sur la page web


Message édité par redah75 le 30-06-2008 à 13:44:40
Reply

Marsh Posté le 30-06-2008 à 14:00:13    

En soit ça marchera mais tu ne respectes pas la 1ère forme normale (à vérifier). Avoir des vides comme ça c'est pas super mais ça a le mérite de fonctionner.
Ta méthode est en fait un peu barbare...


Message édité par antac le 30-06-2008 à 14:03:59
Reply

Marsh Posté le 30-06-2008 à 14:51:48    

barbare??? :)
je peux l'ameliorer en faisant ceci:
 
id_tech  |  id_fonc  |  titre  |  resume  |  langue  |  source  |  auteur  |  prix  |  isbn  |  ...  
----------------------------------------------------------------------------------------------------------------------------  
1               1          Bonjour  Bonjour        fr             13          12         26     BL263    ...  
2               1          Hello      Hello           en            56          24         58     CR78  
3               1          Hola                        es            78          33         30     CL78
 
lorsque la langue est dif de 'en' ou 'fr' c'est que le titre est en une langue autre que 'fr' et 'en'
 
je suis d'accord avec toi qu'il faut creer une table relationnelle, mais c embetant lorsqu'il faut faire une recherche ds les 2 tables

Reply

Marsh Posté le 30-06-2008 à 14:53:04    

bah non c'est pas embettant, les jointures sont là pour ça.

Reply

Marsh Posté le 30-06-2008 à 15:03:41    

antac, ne prends pas mal ce que je vais dire, et je ne mets pas tes paroles en doute ; mais j'aimerais juste avoir differents avis d'autres personnes...
tu sais, la solution que je viens de citer, m'a ete recommande par un ami qui travaille que ds les bdd, elle m'a paru un peu bizarre au debut, mais finalement je la trouve pas mal!!!

Reply

Marsh Posté le 30-06-2008 à 15:14:18    

Bien sur, je ne prétends pas avoir la science infuse.

Reply

Marsh Posté le 30-06-2008 à 15:14:18   

Reply

Marsh Posté le 30-06-2008 à 15:38:51    

merci pour ta comprehension ;)

Reply

Marsh Posté le 01-07-2008 à 12:18:36    

eh ben, je vois que mon sujet ne passionne personne :(

Reply

Marsh Posté le 01-07-2008 à 16:59:03    

Bon, je ne peux pas attendre plus longtemps!!
Antac ; g mis en place ta solution :
 
articles:
id | type | titre_original | titre_en | titre_fr | resume_en | resume_fr | langue | source | auteur | prix | et qlq autres champs
------------------------------------------------------------------------------------------------------------------
 
et une autre table pour les autres memes articles en autres langues :
 
articles_lies
id_article | langue | source | prix | nb_pages
 
 
j'ai par contre un autre petit et dernier probleme (enfin je l'espere :)) :
au niveau de la source, j'ai 3 types de sources : revue, comptes rendus ou ouvrage
entre ces 3 types de sources, j'ai que qlq champs en commun.
faut il creer 1 seule table avec tous les champs pôur les 3 types de sources ou plutot creer 3 tables ???
 
Merci encore une fois

Reply

Marsh Posté le 01-07-2008 à 17:20:53    

ARTICLE
--------
ID
TYPE
LANGUE_EDITION_ORIGINALE
(et c'est tout j'ai l'impression)
 
TRADUCTION
------------
ARTICLE_ID
LANGUE_ID
TITRE
RESUME
SOURCE_ID
AUTEUR_ID
PRIX
 
 
+ tables langue, source et auteur
 
Le "langue_edition_originale" dans la table article permet de retrouver quelle est la traduction qui contient les informations de l'édition originale.
 
A noter qu'il y a une faille dans ce système : d'un point de vue purement littéraire (si c'est bien des bouquins que tu gères) tu peux avoir plusieurs éditeurs qui diffusent le même bouquin, parfois sous un nom différent.
 
Et sans oublier les recceuils de bouquins.
 
Je vais pas entrer dans le détail du MCD utilisé à la BNF (d'autant que je trouve complètement absurde et source de tout un tas de problèmes), mais là il manque des informations d'édition, d'oeuvre, de pièce physique, etc.


Message édité par MagicBuzz le 01-07-2008 à 17:21:28
Reply

Marsh Posté le 01-07-2008 à 17:54:42    

Bonjour MagicBuzz, et merci pour ta reponse :)
 
dans mon cas, il s'agit d'une bdd bilingue et je dois maintenir la traduction des titres et resumes.
qu'est ce qui ne va pas ds ma structure de base?? et desole, car j'avais fait une erreur, c'est peut etre pour cela :)
le champs 'titre_original' doit etre ajoute ds la table 'articles_lies' :
 
articles :  
id | type | titre_original | titre_en | titre_fr | resume_en | resume_fr | langue | source | auteur | prix | nb_pages
-------------------------------------------------------------------------------------------------------------
1     1                           Hello       Bonjour   Blabla en     blabla fr         en         12         14       20        92
2     1                           Hello1     Bonjour1  Blabla1 en   blabla1 fr        fr          17         9         42       18
3     1           Hola2         Hello2     Bonjour2  Blabla2 en   blabla2 fr        es         19        17        49       17  
 
 
articles_lies :
id_article | titre_original | langue | source | prix | nb_pages
----------------------------------------------------------
1                                    fr           12      13         80
1                   Hola           es          14      20         73
1                   Ciao           it           25      26         50        
 
 
J'espere que cet exemple te donne une idee meilleure sur ma vision des choses.
 
Pour la langue, est il mieux de mettre 'en', 'fr',... ou carement leurs identifiants de ma table 'langues' ?
 
Merci bien


Message édité par redah75 le 01-07-2008 à 17:58:39
Reply

Marsh Posté le 01-07-2008 à 18:35:59    

ben je vois pas l'intérêt d'avoir des informations titre résumé et autres dans ta table articles alors qu'ils seront bien mieux dans la table articles_lies
=> genre, t'as pas de résumé en italien ou espagnol dans ton exemple, c'est impossible à mettre.
 
ensuite, dans article_lies, ton "titre_original" est faux, puisque c'est le titre traduit, et non le titre original. le seul à être original, c'est celui que tu trouveras dans articles.
 
et là encore, on si t'as de articles fr et des articles en, on saura pas quelle est la colonne qui contient le titre original.
 
et je te dis pas la confusion si tu as un article italien ou espagnol...
 
bref, ton modèle est encore pire qu'au début là... ;)
 
reprend mon modèle, il est clairement mieux, dans la mesure ou t'as 0 trous et aucune redondance... tout en ayant plus d'informations sans confusion possible


Message édité par MagicBuzz le 01-07-2008 à 18:37:15
Reply

Marsh Posté le 01-07-2008 à 18:51:59    

t'as raison, "titre_original" est bien le titre traduit et non pas le titre original!!
je vais reflechir demain a ta structure et te tiens au courant ;)
 
en attendant j'ai 2 question stp :
 
1 - Pour la langue, est il mieux de mettre 'en', 'fr',... ou carement leurs identifiants de ma table 'langues' ?
2 - c'est la question que j'ai pose ds le post precedant :  
au niveau de la source, j'ai 3 types de sources : revue, comptes rendus ou ouvrage  
entre ces 3 types de sources, j'ai que qlq champs en commun.  
faut il creer 1 seule table avec tous les champs pôur les 3 types de sources ou plutot creer 3 tables ???
 
Merci merci merci mille fois ;)

Reply

Marsh Posté le 01-07-2008 à 19:14:22    

"en" et "fr" sont des identifiants selon la norme ISO 639-1.
Donc aucun souci pour utiliser ces clés. La langue à proprement parler, c'est "English", "Français", etc. ;)
 
Par contre, ISO 639-1 est incomplet. L'arabe et le chinois traditionnel par exemple ne sont pas représentés. Pas plus que le québécois n'est différencié du français.
 
On préfèrera utiliser la norme décrite dans la RFC1766 qui est une combinaison des normes ISO 639 et ISO 316.
 
Il s'agit du code ISO-639 suivit d'un tiret et du code ISO-3166 du pays où se trouve la langue. Ainsi, on différencie le français parlé au Canada (fr-CA), du français parlé en France (fr-FR) ou du français parlé en Belgique (fr-BE)
 
C'est notamment intéressant pour les livres car il n'est pas rare que le titre kébélois soit différent du titre français.
 
C'est d'ailleurs ce qui est utilisé sur le net, windows et unix pour définir la locale des programmes, documents, etc. depuis quelques années. (la RFC date de 1995)
 
Pour certains cas particuliers, le Klingon par exemple, qui n'a pas de représentation ISO-639-1 et qui est parlé nulle part, on devra utiliser son code ISO-639-2 (thl) sans le suffixe 3166.


Message édité par MagicBuzz le 01-07-2008 à 19:21:26
Reply

Marsh Posté le 02-07-2008 à 11:11:10    

Merci MagicBuzz pour ta reponse bien detaillee :)
 
alors, je reviens vers les tables articles et traduction, ce que tu me propose toi c'est une structure du genre :
 
articles :  
id  |  type  |  langue_originale
------------------------------
1      1             fr
 
 
articles_traduction :
id_article  |  langue  |  titre  |  resume  |  source  |  auteur  |  prix
------------------------------------------------------------------
1                 fr         bonjour  blabla          12          14           20
 
 
dans ce cas, il s'agit du meme article et qui existe qu'en francais.
c'est pas grave si 'fr' est repete 2 fois?
dans cet exemple, je dois imperativement avoir le resume et le titre traduits en anglais meme si l'article existe qu'en francais.
c'est a dire en gros :
- lorsque j'ai un seul article en 'fr', son resume et titre sont traduits en 'en'
- lorsque j'ai un seul article en 'en', son titre est traduit en francais, et son resume PEUT ETRE traduit egalement en 'fr'
- lorsque j'ai un seul article non 'fr' et 'en', son titre est traduit en 'fr' et 'en' et son resume PEUT ETRE traduit en 'fr' et 'en'
 
l'exemple que j'ai donne hier explique bien ce que je veux :
articles :  
id | type | titre_original | titre_en | titre_fr | resume_en | resume_fr | langue | source | auteur | prix | nb_pages  
-------------------------------------------------------------------------------------------------------------  
2     1                           Hello1     Bonjour1  Blabla1 en   blabla1 fr        fr          17         9         42       18
 
cet article n'existe qu'en francais, mais son titre et resume sont systematiquement traduits en anglais
 
j'espere que cela t'aide a comprendre la situation!!


Message édité par redah75 le 02-07-2008 à 11:14:25
Reply

Marsh Posté le 02-07-2008 à 11:17:54    

non, c'est pas gênant dans la mesure où fr ne veut pas dire la même chose dans les deux tables : dans la première, il indique que la ligne du titre original est celle qui est en français, alors que dans la seconde, il indique que la ligne contient les informations de la version française.
 
pour tes soucis de traductions, je te conseille de créer systématiquement deux lignes fr et en dans les traductions, et rajouter un booléen "edition existante", qui permet de différencier si la ligne parle d'un produit véritable ou d'une simple traduction.

Reply

Marsh Posté le 02-07-2008 à 11:26:35    

Rien à dire de mieux.  
Il y a juste un risque : c'est que l'article soit traduit plusieurs fois dans la même langue avec une source, un auteur et un prix différent...
Dans ce cas là au lieu d'avoir langue_originale dans article, je metterai plutot article_original qui pointe vers id_article de articles_traduction.


Message édité par antac le 02-07-2008 à 11:27:51
Reply

Marsh Posté le 02-07-2008 à 11:57:15    

j'obtiendrai dc qlq chose qui ressemble a ca :
 
articles :  
id  |  type  |  langue_originale  
------------------------------  
1      1             fr  
 
 
articles_traduction :  
id_article  |  langue  |  titre  |  resume  |  source  |  auteur  |  prix  |  meme_article
----------------------------------------------------------------------------------
1                 fr         bonjour  blabla          12          14           20          o                 (o pour oui)
1                 en        Hello     blabla          12          14           20          o
1                 es        Hola      blabla          15          14           17          n
 
Ayeye, je la sens pas trop cette solution de mettre systematiquement un enregistrement pour 'en' et 'fr', puisqu'il s'agit du meme article. dans ce cas, j'airau un repetition de 'source' et 'prix'.
Je pense que 'auteur' dois passer a la table 'articles' puisqu'un article a toujours le meme auteur, meme s'il est traduit en plueisurs langues, l'auteur reste toujorus le meme.
 
 
Antac : si un article est traduit plusieurs fois ds la meme langue, on en prend qu'un :)

Reply

Marsh Posté le 02-07-2008 à 17:03:26    

aucune reponse??? :(

Reply

Marsh Posté le 02-07-2008 à 17:43:42    

ben si c'est le même, oui, mais au début c'st pas ceque tu dirais.
 
la répétition de source et prix, bah ouais, mais faut dire aussi que ton analyse elle est un peu bancale...
 
autre solution : tu ne mets pas de titre dans la table de traduction, et tu la lie avec une autre table supplémentaire qui contient le résumé et le titre : ainsi tu peuxtraduire le titre et le résumé en différentes langues pour un même article.

Reply

Marsh Posté le 02-07-2008 à 17:50:46    

j'ai du mal m'expliquer pour les auteur, desole!!
 
la solution d'une 3eme table pour le tite et resume me parait bien, je vais reflechir a ca et te tiens au courant!!
 
une derniere question stp que j'ai deja pose ds un des messages precedant mais g pas eu de reponse :)
 
au niveau de la source, j'ai 3 types de sources : revue, comptes rendus ou ouvrage  
entre ces 3 types de sources, j'ai que qlq champs en commun.  
faut il creer 1 seule table avec tous les champs pôur les 3 types de sources ou plutot creer 3 tables ???

Reply

Marsh Posté le 02-07-2008 à 17:53:51    

ça dépend du nombre de champs.
 
tu peux aussi utiliser une table générique "attribut1, attribut2, etc."

Reply

Marsh Posté le 02-07-2008 à 18:17:31    

table generique?? qu'est ce que c'est? excuse mon ignorance!!  :??:  
 
les source 'ouvrage' et 'revue' ont 3 ou 4 champs quis different. par contre la source 'comptes rendus' a a peu pres une dizaine de champs de plus que 'ouvrage' et 'revue'.
quelle est a ton avis la meilleure conception de cette table??
 
 
je reviens vers les tables articles; cette structure te va? :)
 
articles :  
id  |  type  |  langue_originale  |  auteur
----------------------------------------
1      1             fr                       16
2      1             it                      14
 
 
articles_traduits :  
id  |  id_article  |  langue  |  source  |  prix  
------------------------------------------------------------------  
1           1             fr           12         20
2           1             es          14         17
3           2             it           20         45    
 
 
articles_traduits_resumes :
id_article_traduit  |  titre  |  resume
----------------------------------------
1                        Bonjour   Blala
1                        Hello       blala
2                        hola       (vide)
3                        Ciao1      (vide)
3                        Bonjour1  blabla1
3                        Hello1      blabla1
 
 
une petite precision, les articles non 'fr' et 'en', uniquement leur titre qui est systematiquement traduit, le resume est traduit a 60%
 
ne penses tu pas que cette structure complique un peu les choses?? :(

Reply

Marsh Posté le 02-07-2008 à 18:24:24    

ben une table générique,c'est une table fourre tout.
 
soit tu vas jusqu'au bout du concept et tu recherches "tbl" "codtbl" dans le moteur de recherche pour retrouver les explications que j'ai pu en faire, soit tu crée une table avec les quelques champs communs à tous tes types de sources, plus une série de champ "anonymes" (champ1, champ2, champ3, etc.) non typés (varchar(50)) et toi dans ton code tu sais que champ2 = age du capitaine parceque c'est la source d'id X
 
de toute façon si les informations des sources sont très spécifiques alors tu seras obligé de faire du spécifique pour les lire/écrire, donc ça ne sera pas plus bloquant que d'avoir une palanquée de champs dédiés dans tous les sens.
 
selon moi, la table vraiment générique (avec le coup des tbl) est la meilleure pour ce genre de choses, puisque tu ne te limite pas, et tu peux automatiser à 100% la gestion des données. par contre ça demande bien plus de boulot.

Reply

Marsh Posté le 02-07-2008 à 18:25:56    

Reply

Marsh Posté le 03-07-2008 à 11:16:25    

OK, cool, je vais creer une seule table pour la source qui contiendra tous les champs des 3 types... et je ne vais pas me casser la tete plus longtemps :)
 
et concernant les tables articles, qu'est ce que tu pense de la structure et exemple que j'ai donne ds mon precedant message? ca ne devient pas lourd a gerer avec les 3 tables??

Reply

Marsh Posté le 07-07-2008 à 12:32:17    

Bonjour,
de retour avec 2 dernieres petites question svp :)
c'est au sujet des dates :
1- pour gerer la date de debut et de fin, creer deux champs "date_debut" et "date_fin" est la seule solution?
2- si je veux stocker une date qui contient que le mois et l'annee, quelle est la meilleure facon de le faire?
 
merci

Reply

Marsh Posté le 18-07-2008 à 10:37:47    

1- soit tu met la "date_debut" et "date_fin", soit tu mets "date-debut" et un autre champ "durée" et comme ça tu connaitras la date-fin avec un simple calcul. Quoi qu'il en soit tu auras 2 champs.
 
2- C'est tout à fait possible mais le langage variera selon le SGBD que tu utilises. Quel SGBD a tu pris?

Reply

Marsh Posté le 18-07-2008 à 11:05:41    

bonjour slr56 et merci pour ta reponse.
j'utilise mysql

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed