web-dev-qa-db-fra.com

Structure de base de données pour la table "client" ayant plusieurs commandes par client et plusieurs articles par commande

J'essaie de créer une base de données où chaque client a plusieurs commandes (nouvelles commandes quotidiennes) et chaque commande a plusieurs articles. J'avais prévu de créer une table de clients et de créer une table par commande et de remplir cette table avec une table "articles". Je pense que cette approche est trop compliquée et lourde car le nombre de commandes peut atteindre des milliers, je ne pense pas que le fait d'avoir des milliers de tables soit maintenable. Selon vous, quelle serait la structure appropriée pour cela? Toute aide est grandement appréciée.

Désolé si c'est une question noobish, j'apprends à programmer. Et c'est ma toute première tentative de conception de base de données.

19
edferda

Vous avez besoin de quatre tables, quelque chose comme ceci:

Possible Simplified Database Model

Les clients

Contient une liste de clients. Une ligne par client. Contiendrait toutes les informations des clients - leurs coordonnées, etc ...

Ordres

Contient une liste de commandes. Une ligne par commande. Chaque commande est passée par un client et possède un Customer_ID - qui peut être utilisé pour créer un lien vers l'enregistrement client. Peut également stocker l'adresse de livraison, si elle est différente de l'adresse du client de leur enregistrement - ou stocker les adresses dans des tables distinctes.

Items commandés

Contient une liste d'articles de commande. Une ligne pour chaque article d'une commande. Ainsi, chaque commande peut générer plusieurs lignes dans ce tableau. Chaque article commandé est un produit de votre inventaire, donc chaque ligne a un product_id, qui est lié à la table des produits.

Des produits

Contient une liste de produits. Une ligne par produit. Similaire au tableau des clients, mais pour les produits - contient tous les détails du produit.

Voici le code SQL que vous pourriez utiliser pour créer cette structure - il créera pour lui-même une base de données appelée mydb:

CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ;
USE `mydb` ;

-- -----------------------------------------------------
-- Table `mydb`.`Customer`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `mydb`.`Customer` (
  `ID` INT NOT NULL ,
  `Name` TEXT NOT NULL ,
  `PhoneNo` VARCHAR(45) NULL ,
  PRIMARY KEY (`ID`) )
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`Order`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `mydb`.`Order` (
  `ID` INT NOT NULL ,
  `customer_id` INT NULL ,
  PRIMARY KEY (`ID`) ,
  INDEX `fk_Order_1_idx` (`customer_id` ASC) ,
  CONSTRAINT `fk_Order_1`
    FOREIGN KEY (`customer_id` )
    REFERENCES `mydb`.`Customer` (`ID` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`Product`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `mydb`.`Product` (
  `ID` INT NOT NULL ,
  `Name` VARCHAR(45) NOT NULL ,
  `Description` TEXT NULL ,
  PRIMARY KEY (`ID`) )
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`OrderItem`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `mydb`.`OrderItem` (
  `ID` INT NOT NULL ,
  `Order_ID` INT NOT NULL ,
  `Product_ID` INT NOT NULL ,
  `Quantity` INT NOT NULL ,
  PRIMARY KEY (`ID`) ,
  INDEX `fk_OrderItem_1_idx` (`Order_ID` ASC) ,
  INDEX `fk_OrderItem_2_idx` (`Product_ID` ASC) ,
  CONSTRAINT `fk_OrderItem_1`
    FOREIGN KEY (`Order_ID` )
    REFERENCES `mydb`.`Order` (`ID` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_OrderItem_2`
    FOREIGN KEY (`Product_ID` )
    REFERENCES `mydb`.`Product` (`ID` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

USE `mydb` ;
49
Duncan Lock

Cela n'a aucun sens de créer une table par commande. Ne fais pas ça. Ce n'est ni pratique, ni maintenable. Vous ne pourrez normalement pas interroger vos données. Pour commencer, il vous suffit de quatre tables comme celle-ci

  • les clients
  • ordres
  • items commandés
  • produits (ou articles)

Voici une démo simplifiée SQLFiddle

3
peterm

J'aurais quelque chose comme une table client avec des tables de commandes et d'articles. La clé primaire du client est la clé de commande étrangère. Les articles auront alors une clé étrangère qui correspond à la commande sur laquelle ils ont été placés.

3 tableaux devraient être bien

0
null

Juste une pensée, ne pouvons-nous pas stocker les ID d'article séparés par des virgules dans la table de commande pour de nombreux articles de commande? Réduisant ainsi le besoin de table "article de commande".

0
Dhaval H. Nena