Catégories et sous-catégories

Catégories et sous-catégories - SQL/NoSQL - Programmation

Marsh Posté le 20-06-2010 à 17:09:45    

Bonjour à tous :)
 
Je suis entrain de mettre au point dans ma base de données des catégories et sous catégories dans lesquelles se trouveront des objets.
Il y a quelques subtilités qui me compliquent la tâche.
En effet, chaque catégorie à un nom mais dans plusieurs langues !
Chaque catégorie peut avoir une ou aucune catégorie mère.
Mais chaque catégorie peut avoir aucune, une ou plusieurs sous catégories.
Par contre pour le moment en tout cas, un objet n'appartient qu'à une seule catégorie !
(Je pense qu'une table supplémentaire serait nécessaire si je le voulais).
 
Voilà comment je voix le truc pour le moment, j'aimerais avoir votre avis,
Pensez vous que je m'y prend bien où bien peut on faire plus simple ou plus propre ?
 
J'ai donc une table catégorie avec les champs suivants
- id (INT) : Simplement l'id de la catégorie (Primary Key)
- mere_id (INT) : Est l'id de la catégorie mère (peut être NULL) (Foreign Key)
- position (INT) : Simplement un paramètre pour l'ordre d'affichage des catégories
 
Et une table langue_categorie
- categorie_id : L'id de la catégorie dont on contient le nom (Fait partie de la Primary Key)
- langue : Simplement la langue de traduction. Exemple : fr en es etc... (Fait partie de la Primary Key)
- nom : Enfin, le nom de la catégorie dans la langue spécifiée au dessus.
 
http://img217.imageshack.us/img217/1230/bddg.jpg
 
Merci d'avance pour vos conseils !!
 
Bonne journée.
 
Balzard
 
Pour ceux qui préfère le SQL :

-- -----------------------------------------------------
-- Table `db`.`categorie`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `db`.`categorie` (
  `id` INT NOT NULL AUTO_INCREMENT ,
  `mere_id` INT NULL DEFAULT NULL ,
  `position` INT NOT NULL DEFAULT 0 ,
  PRIMARY KEY (`id`) ,
  INDEX `fk_categorie_categorie` (`mere_id` ASC) ,
  CONSTRAINT `fk_categorie_categorie`
    FOREIGN KEY (`mere_id` )
    REFERENCES `db`.`categorie` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;
 
 
-- -----------------------------------------------------
-- Table `db`.`langue_categorie`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `db`.`langue_categorie` (
  `categorie_id` INT NOT NULL ,
  `langue` VARCHAR(2) NOT NULL ,
  `nom` VARCHAR(45) NOT NULL ,
  PRIMARY KEY (`categorie_id`, `langue`) ,
  INDEX `fk_langue_categorie_categorie` (`categorie_id` ASC) ,
  CONSTRAINT `fk_langue_categorie_categorie`
    FOREIGN KEY (`categorie_id` )
    REFERENCES `db`.`categorie` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;



Message édité par Balzard le 20-06-2010 à 17:28:03
Reply

Marsh Posté le 20-06-2010 à 17:09:45   

Reply

Marsh Posté le 21-06-2010 à 08:42:01    

C'est la facon standard de gerer les données hierarchique, donc tu devrais pouvoir faire ce que tu veux sans trop de problemes.
 
Il y a quelques subtilité qui peuvent etre ajoutée mais seulement si tu trouves que tu as des problemes de performance (evidement les subtilités dependent de ce que tu veux comme resultat).

Reply

Marsh Posté le 21-06-2010 à 09:33:12    

Le principal pb avec cette modélisation (je l'ai employée dans mes soft Astres et Icare, cf ma signature), c'est l'affichage de l'arbo : t'es obligé de faire pas mal de requêtes, c'est récursif (même si tu peux mettre en oeuvre un algo itératif à base d'un tableau et de 2 indexes).
 
Une autre modélisation possible et plus pratique à manipuler, la représentation intervallaire : http://sqlpro.developpez.com/cours/arborescence/


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Sujets relatifs:

Leave a Replay

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