各顧客が複数の注文(毎日新しい注文)を持ち、各注文に複数のアイテムがあるデータベースを作成しようとしています。顧客のテーブルを作成し、注文ごとにテーブルを作成し、このテーブルに「アイテム」テーブルを追加することを計画していました。注文の数が数千に達する可能性があるため、このアプローチは複雑すぎて面倒だと思います。これに適切な構造は何だと思いますか?どんな助けも大歓迎です。
これが初心者向けの質問なら申し訳ありませんが、私はプログラムを学んでいます。そして、これはデータベース設計における私の初めての試みです。
次のような4つのテーブルが必要です。
顧客のリストが含まれています。顧客ごとに1行。連絡先の詳細など、すべての顧客情報が含まれます。
注文のリストが含まれています。注文ごとに1行。各注文は顧客によって行われ、Customer_ID
-顧客レコードにリンクするために使用できます。記録から顧客の住所と異なる場合は、配達先住所を保存することもできます-または、住所を別のテーブルに保存します。
注文アイテムのリストが含まれています。注文のアイテムごとに1行-したがって、各注文はこのテーブルに複数の行を生成できます。注文された各アイテムは在庫からの製品であるため、各行にはproductテーブルにリンクするproduct_idがあります。
製品のリストが含まれています。製品ごとに1行。 customers表に似ていますが、製品の場合-すべての製品の詳細が含まれています。
この構造を作成するために使用できるSQLコードは次のとおりです。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` ;
注文ごとにテーブルを作成しても意味がありません。しないでください。実用的ではなく、保守もできません。通常、データをクエリすることはできません。まず最初に、このような4つのテーブルだけが必要です。
簡単すぎますSQLFiddleデモ
顧客テーブルと注文およびアイテムテーブルのようなものがあります。顧客の主キーは注文の外部キーです。アイテムには、それが置かれた注文と一致する外部キーがあります。
3つのテーブルで構いません
多くの注文商品の注文テーブルにコンマ区切りの商品IDを保存することはできませんか?したがって、「注文項目」テーブルの必要性を減らします。