conception base de donnees +erreur (errno: 121)

conception base de donnees +erreur (errno: 121) - SQL/NoSQL - Programmation

Marsh Posté le 11-01-2007 à 16:44:04    

Salut a tous,  
 
suite des pb lies a ce  fil http://forum.hardware.fr/hfr/Progr [...] 1501641...
Je fait un ptit resumé, maintenant que tout marche a peu pres mais je doute en fait sur la conception de base:
 
Je veut faire une base de donnees de d'images, qui peuvent etre classifiable via un menue categorie et dont le nom peut etre soit en espagnol soit en francais:
 
J ai creer mes bases comme suit:
 

Citation :

CREATE TABLE `categories` (
  `index_cat` SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `nom` VARCHAR(12) NOT NULL,
  PRIMARY KEY (`index_cat`)
)
TYPE = innodb
COMMENT = 'la table categories';
 
 
CREATE TABLE `images` (
  index_images MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT,  
  format VARCHAR(12),  
  teinte VARCHAR(12) NOT NULL,  
  index_cat SMALLINT UNSIGNED,
  INDEX idx(index_cat),
  PRIMARY KEY (index_images),
  CONSTRAINT fk_index_cat FOREIGN KEY (index_cat) REFERENCES categories (index_cat) ON DELETE CASCADE
)
TYPE = innodb
COMMENT = 'la table images';
 
CREATE TABLE `tag_es` (
 
  index_es MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT,
  tags_es VARCHAR(32) NOT NULL,  
  index_images MEDIUMINT UNSIGNED,
  INDEX idx(index_images),
  PRIMARY KEY (index_es),
  CONSTRAINT fk_index_images FOREIGN KEY (index_images) REFERENCES images (index_images) ON DELETE CASCADE
)
TYPE = innodb
COMMENT = 'la table espagnole';
 
 
CREATE TABLE `tag_fr` (
 
  index_fr MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT,
  tags_fr VARCHAR(32) NOT NULL,  
  index_images MEDIUMINT UNSIGNED,
  INDEX idx(index_images),
  PRIMARY KEY (index_fr),
  CONSTRAINT fk_index_images FOREIGN KEY (index_images) REFERENCES images (index_images) ON DELETE CASCADE
)
TYPE = innodb
COMMENT = 'la table francaise';


 
Le pb est que mysql refuse de creer 2 tables qui ont une meme cle etrangere!?enfin d apres ce que j ai compris:

Citation :

ERROR 1005: Can't create table './ma_base/tag_fr.frm' (errno: 121)


 
du coup je me demande si c est pas au niveau conception que j ai foirer le truc :??: (faut dire que c est pas mon fort :o )
 
merci de l'aide


Message édité par krifur le 11-01-2007 à 19:31:29
Reply

Marsh Posté le 11-01-2007 à 16:44:04   

Reply

Marsh Posté le 11-01-2007 à 19:53:17    

je fait un mpd ca parle mieux ptet :D

 

categories: (index_cat,nom)

 

image: (index_images, format ,teinte,#index_cat)

 

tag_fr: (index_fr,tags_fr,#index_images)

 

tag_es: (index_es,tags_es,#index_images)

 

c 'est valable comme schema ?
L idee c est de separe les champs lies aux langues pour ne pas utiliser des tables inutiles en fonction du choix de l internaute(site multi-langues)


Message édité par krifur le 11-01-2007 à 19:59:45
Reply

Marsh Posté le 12-01-2007 à 00:09:02    

bon pb resolut pour le ERROR 1005: Can't create table './ma_base/tag_fr.frm' (errno: 121)
 
en fait c est parce que je nommer la clé etrangere identiquement dans les 2 tables filles(index_images), j en ai renommer une et ca marche maintenant...
Je laisse le post au cas ou quelqu'un est quelquechose a dire sur la conception.
++

Reply

Marsh Posté le 12-01-2007 à 12:31:11    

moi je trouve la conception des tables langues bizarre.
 
ça t'oblige à faire des requêtes dynamiques en fonction de la langue choisit alors que tu pourrais tout faire en SQL.
Si tu as beaucoup de tags ça pourrait influer sur les perfs.
 
moi je ferais
 
tags(index, langue, tag,#index_images) avec (index,langue) comme clé primaire


Message édité par tg94 le 12-01-2007 à 12:31:44
Reply

Marsh Posté le 12-01-2007 à 14:29:59    

Salut, tu peut detailler un peu plus stp :D ?
 

Citation :

ça t'oblige à faire des requêtes dynamiques en fonction de la langue choisit alors que tu pourrais tout faire en SQL.


Ca je comprends pas trop...
La facon dont je voit mon site c est qu'une fois que l'internaute a choisit sa langue il n y a plus qu une table a chargé ce qui allége la complexité des requetes?

Citation :


 
moi je ferais
 
tags(index, langue, tag,#index_images) avec (index,langue) comme clé primaire


donc ca donnerait:
 
 
categories: (index_cat,nom)
image: (index_images, format ,teinte,#index_cat)  
tags(index, langue, tag, #index_images)  
 
mais la touts les tags sont dans une seule et meme table alors que y en a la moitie qui sert a rien ...
 :hello:  

Reply

Marsh Posté le 13-01-2007 à 12:35:26    

krifur a écrit :

Salut, tu peut detailler un peu plus stp :D ?
 

Citation :

ça t'oblige à faire des requêtes dynamiques en fonction de la langue choisit alors que tu pourrais tout faire en SQL.


Ca je comprends pas trop...
La facon dont je voit mon site c est qu'une fois que l'internaute a choisit sa langue il n y a plus qu une table a chargé ce qui allége la complexité des requetes?

Citation :


 
moi je ferais
 
tags(index, langue, tag,#index_images) avec (index,langue) comme clé primaire


donc ca donnerait:
 
 
categories: (index_cat,nom)
image: (index_images, format ,teinte,#index_cat)  
tags(index, langue, tag, #index_images)  
 
mais la touts les tags sont dans une seule et meme table alors que y en a la moitie qui sert a rien ...
 :hello:


 
 
Si tu mets plusieurs tables pour plusieurs langues, il y aura forcément un endroit dans ton code où tu diras "si la langue sélectionnée est X, alors dans la requête faut mettre from tag_X"
-> tu passes par le PHP alors que tout pourrait être fait en SQL.
 
 
D'autres part, même si les 3/4 des tags sont pas utilisés, je ne vois pas le pb de les mettre dans une même table. Un SGBD, même MySQL sait gérer des millions de lignes, c'est pas 20 tags pour l'espagnol qui va ralentir qqch et ça fera un modèle de données plus propre.

Reply

Marsh Posté le 13-01-2007 à 21:01:44    

ok; merci tg94 je vais essayer avec ton modele c est vrai que pour un pti site ca devrait aller, sinon j aimerai savoir comment inserer une requete dans les 2 tables, images et tag en "cascade" pour les effacer ok ca marche mais a la creation, comment faire un insert qui lie les 2 tables sans faire 2 requetes?
c est possible?

 

ps:j edite le titre
edit , ah beh non ca a pas l air possible :D

 

merci


Message édité par krifur le 13-01-2007 à 21:02:59
Reply

Marsh Posté le 14-01-2007 à 12:47:38    

euh... en fait j'ai pas compris la ou les questions.

Reply

Marsh Posté le 15-01-2007 à 01:06:00    

ok je la refait alors,
 
Grace a la cle etrangere creer avec cette manip:

Citation :

CONSTRAINT fk_index_images FOREIGN KEY (index_images) REFERENCES images (index_images) ON DELETE CASCADE  


 
il me suffit de faire  

Citation :

delete from images where index_images='23';  

pour virer une image de la table images et de la table tag
 
mais je voudrais savoir si une requete existe pour ajouter 2 entrees simultanement dans ces tables?
 
genre insert into images  ('','','','') et automatiquement que le champ tags de la table tag soit inscrit avec le numero index_images associes via la  cle etrangere...
 
voila , quelquechose qui permet de "on create cascade"...
 
 
 
 

Reply

Marsh Posté le 15-01-2007 à 10:09:01    

tu peux le faire avec un trigger on insert sur la table images.
 
mais je ne suis pas sûr que MySQL puisse le faire.

Reply

Marsh Posté le 15-01-2007 à 10:09:01   

Reply

Marsh Posté le 15-01-2007 à 10:49:34    

http://dev.mysql.com/doc/refman/5. [...] igger.html
 
Le pb c est que j ai qu'une version 4.0 (ca va peut etre changer si etch passe en stable)
 
Ok donc je laisse la double insertion simultanee de cote, du coup pour remplir mes bases je fait un:
 
insert into images values ('','','','');
$plop = mysql_insert_id();
suivit d un insert into tags ('','','','". $plop ."');
 
y a pas mieux comme syntax?
merci pour tes reponses :hello:

Reply

Marsh Posté le 15-01-2007 à 11:00:14    

je ne pense pas qu'il y ait mieux, en tout cas j'aurais fait qqch dans le même style.
 
Bon courage.

Reply

Marsh Posté le 15-01-2007 à 11:54:24    

merci a toi   :jap:

Reply

Sujets relatifs:

Leave a Replay

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