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.
Vous avez besoin de quatre tables, quelque chose comme ceci:
Contient une liste de clients. Une ligne par client. Contiendrait toutes les informations des clients - leurs coordonnées, etc ...
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.
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.
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` ;
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
Voici une démo simplifiée SQLFiddle
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
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".